From 5972c48c4fe848b6940f1fc378b291937fa6519c Mon Sep 17 00:00:00 2001 From: Wendell Jones Date: Tue, 20 May 2025 12:11:13 -0400 Subject: [PATCH] initial commit --- .gitignore | 16 + flaskwebproject/FlaskWebProject1.pyproj | 125 + flaskwebproject/FlaskWebProject1.pyproj.user | 7 + .../FlaskWebProject1/Include/Python-ast.h | 637 ++ .../FlaskWebProject1/Include/Python.h | 139 + .../FlaskWebProject1/Include/abstract.h | 1377 +++ .../FlaskWebProject1/Include/accu.h | 37 + .../FlaskWebProject1/Include/asdl.h | 46 + .../FlaskWebProject1/Include/ast.h | 22 + .../FlaskWebProject1/Include/bitset.h | 32 + .../FlaskWebProject1/Include/bltinmodule.h | 14 + .../FlaskWebProject1/Include/boolobject.h | 34 + .../Include/bytearrayobject.h | 62 + .../FlaskWebProject1/Include/bytes_methods.h | 67 + .../FlaskWebProject1/Include/bytesobject.h | 224 + .../FlaskWebProject1/Include/cellobject.h | 29 + .../FlaskWebProject1/Include/ceval.h | 236 + .../FlaskWebProject1/Include/classobject.h | 58 + .../FlaskWebProject1/Include/code.h | 157 + .../FlaskWebProject1/Include/codecs.h | 240 + .../FlaskWebProject1/Include/compile.h | 73 + .../FlaskWebProject1/Include/complexobject.h | 69 + .../FlaskWebProject1/Include/datetime.h | 260 + .../FlaskWebProject1/Include/descrobject.h | 107 + .../FlaskWebProject1/Include/dictobject.h | 177 + .../FlaskWebProject1/Include/dtoa.h | 19 + .../Include/dynamic_annotations.h | 499 + .../FlaskWebProject1/Include/enumobject.h | 17 + .../FlaskWebProject1/Include/errcode.h | 38 + .../FlaskWebProject1/Include/eval.h | 27 + .../FlaskWebProject1/Include/fileobject.h | 50 + .../FlaskWebProject1/Include/fileutils.h | 146 + .../FlaskWebProject1/Include/floatobject.h | 130 + .../FlaskWebProject1/Include/frameobject.h | 95 + .../FlaskWebProject1/Include/funcobject.h | 103 + .../FlaskWebProject1/Include/genobject.h | 104 + .../FlaskWebProject1/Include/graminit.h | 88 + .../FlaskWebProject1/Include/grammar.h | 94 + .../FlaskWebProject1/Include/import.h | 140 + .../FlaskWebProject1/Include/intrcheck.h | 24 + .../FlaskWebProject1/Include/iterobject.h | 25 + .../FlaskWebProject1/Include/listobject.h | 81 + .../FlaskWebProject1/Include/longintrepr.h | 99 + .../FlaskWebProject1/Include/longobject.h | 215 + .../FlaskWebProject1/Include/marshal.h | 28 + .../FlaskWebProject1/Include/memoryobject.h | 72 + .../FlaskWebProject1/Include/metagrammar.h | 18 + .../FlaskWebProject1/Include/methodobject.h | 110 + .../FlaskWebProject1/Include/modsupport.h | 183 + .../FlaskWebProject1/Include/moduleobject.h | 89 + .../Include/namespaceobject.h | 19 + .../FlaskWebProject1/Include/node.h | 44 + .../FlaskWebProject1/Include/object.h | 1077 ++ .../FlaskWebProject1/Include/objimpl.h | 370 + .../FlaskWebProject1/Include/odictobject.h | 43 + .../FlaskWebProject1/Include/opcode.h | 146 + .../FlaskWebProject1/Include/osdefs.h | 47 + .../FlaskWebProject1/Include/osmodule.h | 17 + .../FlaskWebProject1/Include/parsetok.h | 108 + .../FlaskWebProject1/Include/patchlevel.h | 35 + .../FlaskWebProject1/Include/pgen.h | 18 + .../FlaskWebProject1/Include/pgenheaders.h | 43 + .../FlaskWebProject1/Include/py_curses.h | 178 + .../FlaskWebProject1/Include/pyarena.h | 64 + .../FlaskWebProject1/Include/pyatomic.h | 250 + .../FlaskWebProject1/Include/pycapsule.h | 59 + .../FlaskWebProject1/Include/pyconfig.h | 687 ++ .../FlaskWebProject1/Include/pyctype.h | 33 + .../FlaskWebProject1/Include/pydebug.h | 40 + .../FlaskWebProject1/Include/pydtrace.h | 53 + .../FlaskWebProject1/Include/pyerrors.h | 503 + .../FlaskWebProject1/Include/pyexpat.h | 53 + .../FlaskWebProject1/Include/pyfpe.h | 176 + .../FlaskWebProject1/Include/pygetopt.h | 21 + .../FlaskWebProject1/Include/pyhash.h | 145 + .../FlaskWebProject1/Include/pylifecycle.h | 129 + .../FlaskWebProject1/Include/pymacconfig.h | 102 + .../FlaskWebProject1/Include/pymacro.h | 98 + .../FlaskWebProject1/Include/pymath.h | 230 + .../FlaskWebProject1/Include/pymem.h | 233 + .../FlaskWebProject1/Include/pyport.h | 767 ++ .../FlaskWebProject1/Include/pystate.h | 324 + .../FlaskWebProject1/Include/pystrcmp.h | 23 + .../FlaskWebProject1/Include/pystrhex.h | 19 + .../FlaskWebProject1/Include/pystrtod.h | 45 + .../FlaskWebProject1/Include/pythonrun.h | 197 + .../FlaskWebProject1/Include/pythread.h | 90 + .../FlaskWebProject1/Include/pytime.h | 211 + .../FlaskWebProject1/Include/rangeobject.h | 27 + .../FlaskWebProject1/Include/setobject.h | 108 + .../FlaskWebProject1/Include/sliceobject.h | 65 + .../FlaskWebProject1/Include/structmember.h | 74 + .../FlaskWebProject1/Include/structseq.h | 49 + .../FlaskWebProject1/Include/symtable.h | 119 + .../FlaskWebProject1/Include/sysmodule.h | 43 + .../FlaskWebProject1/Include/token.h | 90 + .../FlaskWebProject1/Include/traceback.h | 119 + .../FlaskWebProject1/Include/tupleobject.h | 73 + .../FlaskWebProject1/Include/typeslots.h | 85 + .../FlaskWebProject1/Include/ucnhash.h | 36 + .../FlaskWebProject1/Include/unicodeobject.h | 2342 ++++ .../FlaskWebProject1/Include/warnings.h | 63 + .../FlaskWebProject1/Include/weakrefobject.h | 86 + .../FlaskWebProject1/Lib/__future__.py | 140 + .../FlaskWebProject1/Lib/_bootlocale.py | 34 + .../FlaskWebProject1/Lib/_collections_abc.py | 1011 ++ .../FlaskWebProject1/Lib/_dummy_thread.py | 163 + .../FlaskWebProject1/Lib/_weakrefset.py | 196 + flaskwebproject/FlaskWebProject1/Lib/abc.py | 250 + .../FlaskWebProject1/Lib/base64.py | 602 + .../FlaskWebProject1/Lib/bisect.py | 92 + .../FlaskWebProject1/Lib/codecs.py | 1113 ++ .../Lib/collections/__init__.py | 1244 +++ .../FlaskWebProject1/Lib/collections/abc.py | 2 + flaskwebproject/FlaskWebProject1/Lib/copy.py | 313 + .../FlaskWebProject1/Lib/copyreg.py | 206 + .../Lib/distutils/__init__.py | 116 + .../Lib/distutils/distutils.cfg | 6 + .../Lib/encodings/__init__.py | 169 + .../FlaskWebProject1/Lib/encodings/aliases.py | 550 + .../FlaskWebProject1/Lib/encodings/ascii.py | 50 + .../Lib/encodings/base64_codec.py | 55 + .../FlaskWebProject1/Lib/encodings/big5.py | 39 + .../Lib/encodings/big5hkscs.py | 39 + .../Lib/encodings/bz2_codec.py | 78 + .../FlaskWebProject1/Lib/encodings/charmap.py | 69 + .../FlaskWebProject1/Lib/encodings/cp037.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1006.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1026.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1125.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp1140.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1250.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1251.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1252.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1253.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1254.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1255.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1256.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1257.py | 307 + .../FlaskWebProject1/Lib/encodings/cp1258.py | 307 + .../FlaskWebProject1/Lib/encodings/cp273.py | 307 + .../FlaskWebProject1/Lib/encodings/cp424.py | 307 + .../FlaskWebProject1/Lib/encodings/cp437.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp500.py | 307 + .../FlaskWebProject1/Lib/encodings/cp65001.py | 43 + .../FlaskWebProject1/Lib/encodings/cp720.py | 309 + .../FlaskWebProject1/Lib/encodings/cp737.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp775.py | 697 ++ .../FlaskWebProject1/Lib/encodings/cp850.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp852.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp855.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp856.py | 307 + .../FlaskWebProject1/Lib/encodings/cp857.py | 694 ++ .../FlaskWebProject1/Lib/encodings/cp858.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp860.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp861.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp862.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp863.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp864.py | 690 ++ .../FlaskWebProject1/Lib/encodings/cp865.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp866.py | 698 ++ .../FlaskWebProject1/Lib/encodings/cp869.py | 689 ++ .../FlaskWebProject1/Lib/encodings/cp874.py | 307 + .../FlaskWebProject1/Lib/encodings/cp875.py | 307 + .../FlaskWebProject1/Lib/encodings/cp932.py | 39 + .../FlaskWebProject1/Lib/encodings/cp949.py | 39 + .../FlaskWebProject1/Lib/encodings/cp950.py | 39 + .../Lib/encodings/euc_jis_2004.py | 39 + .../Lib/encodings/euc_jisx0213.py | 39 + .../FlaskWebProject1/Lib/encodings/euc_jp.py | 39 + .../FlaskWebProject1/Lib/encodings/euc_kr.py | 39 + .../FlaskWebProject1/Lib/encodings/gb18030.py | 39 + .../FlaskWebProject1/Lib/encodings/gb2312.py | 39 + .../FlaskWebProject1/Lib/encodings/gbk.py | 39 + .../Lib/encodings/hex_codec.py | 55 + .../Lib/encodings/hp_roman8.py | 314 + .../FlaskWebProject1/Lib/encodings/hz.py | 39 + .../FlaskWebProject1/Lib/encodings/idna.py | 309 + .../Lib/encodings/iso2022_jp.py | 39 + .../Lib/encodings/iso2022_jp_1.py | 39 + .../Lib/encodings/iso2022_jp_2.py | 39 + .../Lib/encodings/iso2022_jp_2004.py | 39 + .../Lib/encodings/iso2022_jp_3.py | 39 + .../Lib/encodings/iso2022_jp_ext.py | 39 + .../Lib/encodings/iso2022_kr.py | 39 + .../Lib/encodings/iso8859_1.py | 307 + .../Lib/encodings/iso8859_10.py | 307 + .../Lib/encodings/iso8859_11.py | 307 + .../Lib/encodings/iso8859_13.py | 307 + .../Lib/encodings/iso8859_14.py | 307 + .../Lib/encodings/iso8859_15.py | 307 + .../Lib/encodings/iso8859_16.py | 307 + .../Lib/encodings/iso8859_2.py | 307 + .../Lib/encodings/iso8859_3.py | 307 + .../Lib/encodings/iso8859_4.py | 307 + .../Lib/encodings/iso8859_5.py | 307 + .../Lib/encodings/iso8859_6.py | 307 + .../Lib/encodings/iso8859_7.py | 307 + .../Lib/encodings/iso8859_8.py | 307 + .../Lib/encodings/iso8859_9.py | 307 + .../FlaskWebProject1/Lib/encodings/johab.py | 39 + .../FlaskWebProject1/Lib/encodings/koi8_r.py | 307 + .../FlaskWebProject1/Lib/encodings/koi8_t.py | 308 + .../FlaskWebProject1/Lib/encodings/koi8_u.py | 307 + .../FlaskWebProject1/Lib/encodings/kz1048.py | 307 + .../FlaskWebProject1/Lib/encodings/latin_1.py | 50 + .../Lib/encodings/mac_arabic.py | 698 ++ .../Lib/encodings/mac_centeuro.py | 307 + .../Lib/encodings/mac_croatian.py | 307 + .../Lib/encodings/mac_cyrillic.py | 307 + .../Lib/encodings/mac_farsi.py | 307 + .../Lib/encodings/mac_greek.py | 307 + .../Lib/encodings/mac_iceland.py | 307 + .../Lib/encodings/mac_latin2.py | 312 + .../Lib/encodings/mac_roman.py | 307 + .../Lib/encodings/mac_romanian.py | 307 + .../Lib/encodings/mac_turkish.py | 307 + .../FlaskWebProject1/Lib/encodings/mbcs.py | 47 + .../FlaskWebProject1/Lib/encodings/oem.py | 41 + .../FlaskWebProject1/Lib/encodings/palmos.py | 308 + .../FlaskWebProject1/Lib/encodings/ptcp154.py | 312 + .../Lib/encodings/punycode.py | 237 + .../Lib/encodings/quopri_codec.py | 56 + .../Lib/encodings/raw_unicode_escape.py | 45 + .../FlaskWebProject1/Lib/encodings/rot_13.py | 113 + .../Lib/encodings/shift_jis.py | 39 + .../Lib/encodings/shift_jis_2004.py | 39 + .../Lib/encodings/shift_jisx0213.py | 39 + .../FlaskWebProject1/Lib/encodings/tis_620.py | 307 + .../Lib/encodings/undefined.py | 49 + .../Lib/encodings/unicode_escape.py | 45 + .../Lib/encodings/unicode_internal.py | 45 + .../FlaskWebProject1/Lib/encodings/utf_16.py | 155 + .../Lib/encodings/utf_16_be.py | 42 + .../Lib/encodings/utf_16_le.py | 42 + .../FlaskWebProject1/Lib/encodings/utf_32.py | 150 + .../Lib/encodings/utf_32_be.py | 37 + .../Lib/encodings/utf_32_le.py | 37 + .../FlaskWebProject1/Lib/encodings/utf_7.py | 38 + .../FlaskWebProject1/Lib/encodings/utf_8.py | 42 + .../Lib/encodings/utf_8_sig.py | 130 + .../Lib/encodings/uu_codec.py | 99 + .../Lib/encodings/zlib_codec.py | 77 + flaskwebproject/FlaskWebProject1/Lib/enum.py | 875 ++ .../FlaskWebProject1/Lib/fnmatch.py | 109 + .../FlaskWebProject1/Lib/functools.py | 811 ++ .../FlaskWebProject1/Lib/genericpath.py | 151 + .../FlaskWebProject1/Lib/hashlib.py | 251 + flaskwebproject/FlaskWebProject1/Lib/heapq.py | 607 + flaskwebproject/FlaskWebProject1/Lib/hmac.py | 144 + flaskwebproject/FlaskWebProject1/Lib/imp.py | 346 + .../Lib/importlib/__init__.py | 173 + .../Lib/importlib/_bootstrap.py | 1161 ++ .../Lib/importlib/_bootstrap_external.py | 1443 +++ .../FlaskWebProject1/Lib/importlib/abc.py | 329 + .../Lib/importlib/machinery.py | 21 + .../FlaskWebProject1/Lib/importlib/util.py | 288 + flaskwebproject/FlaskWebProject1/Lib/io.py | 99 + .../FlaskWebProject1/Lib/keyword.py | 94 + .../FlaskWebProject1/Lib/linecache.py | 177 + .../Lib/no-global-site-packages.txt | 0 .../FlaskWebProject1/Lib/ntpath.py | 693 ++ .../FlaskWebProject1/Lib/operator.py | 464 + .../FlaskWebProject1/Lib/orig-prefix.txt | 1 + flaskwebproject/FlaskWebProject1/Lib/os.py | 1069 ++ .../FlaskWebProject1/Lib/posixpath.py | 522 + .../FlaskWebProject1/Lib/random.py | 770 ++ flaskwebproject/FlaskWebProject1/Lib/re.py | 381 + .../FlaskWebProject1/Lib/reprlib.py | 164 + .../FlaskWebProject1/Lib/rlcompleter.py | 205 + .../FlaskWebProject1/Lib/shutil.py | 1153 ++ .../Lib/site-packages/easy_install.py | 5 + .../pip-18.1.dist-info/INSTALLER | 1 + .../pip-18.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-18.1.dist-info/METADATA | 70 + .../site-packages/pip-18.1.dist-info/RECORD | 614 ++ .../site-packages/pip-18.1.dist-info/WHEEL | 6 + .../pip-18.1.dist-info/entry_points.txt | 5 + .../pip-18.1.dist-info/top_level.txt | 1 + .../Lib/site-packages/pip/__init__.py | 1 + .../Lib/site-packages/pip/__main__.py | 19 + .../site-packages/pip/_internal/__init__.py | 78 + .../site-packages/pip/_internal/build_env.py | 142 + .../Lib/site-packages/pip/_internal/cache.py | 202 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 278 + .../pip/_internal/cli/cmdoptions.py | 714 ++ .../pip/_internal/cli/main_parser.py | 96 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 174 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 535 + .../pip/_internal/commands/list.py | 306 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 387 + .../site-packages/pip/_internal/download.py | 921 ++ .../site-packages/pip/_internal/exceptions.py | 268 + .../Lib/site-packages/pip/_internal/index.py | 899 ++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 23 + .../pip/_internal/models/format_control.py | 62 + .../pip/_internal/models/index.py | 29 + .../pip/_internal/models/link.py | 141 + .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 148 + .../pip/_internal/operations/freeze.py | 264 + .../pip/_internal/operations/prepare.py | 355 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../site-packages/pip/_internal/pyproject.py | 144 + .../pip/_internal/req/__init__.py | 69 + .../pip/_internal/req/constructors.py | 298 + .../pip/_internal/req/req_file.py | 340 + .../pip/_internal/req/req_install.py | 860 ++ .../pip/_internal/req/req_set.py | 181 + .../pip/_internal/req/req_tracker.py | 76 + .../pip/_internal/req/req_uninstall.py | 460 + .../site-packages/pip/_internal/resolve.py | 353 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/compat.py | 248 + .../pip/_internal/utils/deprecation.py | 89 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 225 + .../site-packages/pip/_internal/utils/misc.py | 940 ++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 154 + .../pip/_internal/utils/packaging.py | 75 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 + .../pip/_internal/vcs/__init__.py | 509 + .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 346 + .../pip/_internal/vcs/mercurial.py | 101 + .../pip/_internal/vcs/subversion.py | 213 + .../Lib/site-packages/pip/_internal/wheel.py | 831 ++ .../Lib/site-packages/pip/_vendor/__init__.py | 110 + .../Lib/site-packages/pip/_vendor/appdirs.py | 604 + .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../pip/_vendor/certifi/cacert.pem | 4300 ++++++++ .../site-packages/pip/_vendor/certifi/core.py | 37 + .../pip/_vendor/chardet/__init__.py | 39 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 236 + .../pip/_vendor/colorama/initialise.py | 82 + .../pip/_vendor/colorama/win32.py | 156 + .../pip/_vendor/colorama/winterm.py | 162 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/compat.py | 1120 ++ .../pip/_vendor/distlib/database.py | 1336 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1091 ++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 415 + .../pip/_vendor/distlib/version.py | 736 ++ .../pip/_vendor/distlib/wheel.py | 984 ++ .../Lib/site-packages/pip/_vendor/distro.py | 1197 ++ .../pip/_vendor/html5lib/__init__.py | 35 + .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 399 + .../pip/_vendor/idna/idnadata.py | 1893 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8179 ++++++++++++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 21 + .../pip/_vendor/packaging/__init__.py | 14 + .../pip/_vendor/packaging/_compat.py | 30 + .../pip/_vendor/packaging/_structures.py | 70 + .../pip/_vendor/packaging/markers.py | 301 + .../pip/_vendor/packaging/requirements.py | 130 + .../pip/_vendor/packaging/specifiers.py | 774 ++ .../pip/_vendor/packaging/utils.py | 63 + .../pip/_vendor/packaging/version.py | 441 + .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/_in_process.py | 182 + .../site-packages/pip/_vendor/pep517/check.py | 194 + .../pip/_vendor/pep517/colorlog.py | 110 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 150 + .../pip/_vendor/pep517/wrappers.py | 134 + .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../site-packages/pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../pip/_vendor/pytoml/__init__.py | 3 + .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 374 + .../pip/_vendor/pytoml/writer.py | 127 + .../pip/_vendor/requests/__init__.py | 138 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 530 + .../site-packages/pip/_vendor/requests/api.py | 152 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 75 + .../pip/_vendor/requests/cookies.py | 546 + .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 120 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 952 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 741 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 976 ++ .../Lib/site-packages/pip/_vendor/retrying.py | 267 + .../Lib/site-packages/pip/_vendor/six.py | 891 ++ .../pip/_vendor/urllib3/__init__.py | 97 + .../pip/_vendor/urllib3/_collections.py | 332 + .../pip/_vendor/urllib3/connection.py | 403 + .../pip/_vendor/urllib3/connectionpool.py | 906 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 305 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 112 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 457 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 + .../_vendor/urllib3/packages/ordered_dict.py | 259 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 157 + .../pip/_vendor/urllib3/poolmanager.py | 449 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 676 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../pip/_vendor/urllib3/util/connection.py | 126 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 81 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 396 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3171 ++++++ .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-40.6.2.dist-info/INSTALLER | 1 + .../setuptools-40.6.2.dist-info/LICENSE | 19 + .../setuptools-40.6.2.dist-info/METADATA | 73 + .../setuptools-40.6.2.dist-info/RECORD | 188 + .../setuptools-40.6.2.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-40.6.2.dist-info/top_level.txt | 3 + .../setuptools-40.6.2.dist-info/zip-safe | 1 + .../Lib/site-packages/setuptools/__init__.py | 195 + .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 182 + .../setuptools/command/__init__.py | 18 + .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 218 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/egg_info.py | 716 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 200 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 270 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../Lib/site-packages/setuptools/config.py | 635 ++ .../Lib/site-packages/setuptools/dep_util.py | 23 + .../Lib/site-packages/setuptools/depends.py | 186 + .../Lib/site-packages/setuptools/dist.py | 1147 ++ .../Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../Lib/site-packages/setuptools/glibc.py | 86 + .../Lib/site-packages/setuptools/glob.py | 174 + .../Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../Lib/site-packages/setuptools/monkey.py | 179 + .../Lib/site-packages/setuptools/msvc.py | 1301 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1128 ++ .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/py36compat.py | 82 + .../Lib/site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 210 + .../setuptools/windows_support.py | 29 + .../wheel-0.32.3.dist-info/INSTALLER | 1 + .../wheel-0.32.3.dist-info/LICENSE.txt | 22 + .../wheel-0.32.3.dist-info/METADATA | 60 + .../wheel-0.32.3.dist-info/RECORD | 34 + .../wheel-0.32.3.dist-info/WHEEL | 6 + .../wheel-0.32.3.dist-info/entry_points.txt | 6 + .../wheel-0.32.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/wheel/__init__.py | 2 + .../Lib/site-packages/wheel/__main__.py | 19 + .../Lib/site-packages/wheel/bdist_wheel.py | 368 + .../Lib/site-packages/wheel/cli/__init__.py | 87 + .../Lib/site-packages/wheel/cli/convert.py | 269 + .../Lib/site-packages/wheel/cli/install.py | 0 .../Lib/site-packages/wheel/cli/pack.py | 54 + .../Lib/site-packages/wheel/cli/unpack.py | 25 + .../Lib/site-packages/wheel/metadata.py | 141 + .../Lib/site-packages/wheel/pep425tags.py | 185 + .../Lib/site-packages/wheel/pkginfo.py | 43 + .../Lib/site-packages/wheel/util.py | 41 + .../Lib/site-packages/wheel/wheelfile.py | 160 + flaskwebproject/FlaskWebProject1/Lib/site.py | 833 ++ .../FlaskWebProject1/Lib/sre_compile.py | 580 + .../FlaskWebProject1/Lib/sre_constants.py | 233 + .../FlaskWebProject1/Lib/sre_parse.py | 973 ++ flaskwebproject/FlaskWebProject1/Lib/stat.py | 178 + .../FlaskWebProject1/Lib/struct.py | 15 + .../FlaskWebProject1/Lib/tcl8.6/init.tcl | 818 ++ .../FlaskWebProject1/Lib/tempfile.py | 813 ++ flaskwebproject/FlaskWebProject1/Lib/token.py | 143 + .../FlaskWebProject1/Lib/tokenize.py | 793 ++ flaskwebproject/FlaskWebProject1/Lib/types.py | 266 + .../FlaskWebProject1/Lib/warnings.py | 526 + .../FlaskWebProject1/Lib/weakref.py | 632 ++ .../FlaskWebProject1/Scripts/activate | 78 + .../FlaskWebProject1/Scripts/activate.bat | 30 + .../FlaskWebProject1/Scripts/activate.ps1 | 150 + .../FlaskWebProject1/Scripts/activate_this.py | 36 + .../FlaskWebProject1/Scripts/deactivate.bat | 20 + .../Scripts/easy_install-3.6.exe | Bin 0 -> 102838 bytes .../FlaskWebProject1/Scripts/pip.exe | Bin 0 -> 102820 bytes .../FlaskWebProject1/Scripts/python.exe | Bin 0 -> 100504 bytes .../FlaskWebProject1/Scripts/python3.dll | Bin 0 -> 58520 bytes .../FlaskWebProject1/Scripts/python36.dll | Bin 0 -> 3611288 bytes .../FlaskWebProject1/Scripts/pythonw.exe | Bin 0 -> 98968 bytes .../FlaskWebProject1/Scripts/wheel.exe | Bin 0 -> 102816 bytes flaskwebproject/FlaskWebProject1/__init__.py | 30 + flaskwebproject/FlaskWebProject1/models.py | 416 + flaskwebproject/FlaskWebProject1/routes.py | 2 + .../static/content/bootstrap.css | 6816 ++++++++++++ .../static/content/bootstrap.min.css | 20 + .../FlaskWebProject1/static/content/site.css | 42 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 14079 bytes .../fonts/glyphicons-halflings-regular.svg | 228 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 29512 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 16448 bytes .../static/scripts/_references.js | Bin 0 -> 396 bytes .../static/scripts/bootstrap.js | 2014 ++++ .../static/scripts/bootstrap.min.js | 21 + .../scripts/jquery-1.10.2.intellisense.js | 2671 +++++ .../static/scripts/jquery-1.10.2.js | 9803 +++++++++++++++++ .../static/scripts/jquery-1.10.2.min.js | 23 + .../static/scripts/jquery-1.10.2.min.map | 1 + .../static/scripts/jquery.validate-vsdoc.js | 1302 +++ .../static/scripts/jquery.validate.js | 1245 +++ .../static/scripts/jquery.validate.min.js | 16 + .../scripts/jquery.validate.unobtrusive.js | 344 + .../jquery.validate.unobtrusive.min.js | 19 + .../static/scripts/modernizr-2.6.2.js | 1416 +++ .../static/scripts/respond.js | 340 + .../static/scripts/respond.min.js | 20 + .../FlaskWebProject1/tcl/tcl8.6/auto.tcl | 651 ++ .../tcl/tcl8.6/encoding/ascii.enc | 20 + .../tcl/tcl8.6/encoding/cp1250.enc | 20 + .../tcl/tcl8.6/encoding/cp1251.enc | 20 + .../tcl/tcl8.6/encoding/cp1252.enc | 20 + .../tcl/tcl8.6/encoding/cp1253.enc | 20 + .../tcl/tcl8.6/encoding/cp1254.enc | 20 + .../tcl/tcl8.6/encoding/cp1255.enc | 20 + .../tcl/tcl8.6/encoding/cp1256.enc | 20 + .../tcl/tcl8.6/encoding/cp1257.enc | 20 + .../tcl/tcl8.6/encoding/cp1258.enc | 20 + .../tcl/tcl8.6/encoding/cp437.enc | 20 + .../tcl/tcl8.6/encoding/cp737.enc | 20 + .../tcl/tcl8.6/encoding/cp775.enc | 20 + .../tcl/tcl8.6/encoding/cp850.enc | 20 + .../tcl/tcl8.6/encoding/cp852.enc | 20 + .../tcl/tcl8.6/encoding/cp855.enc | 20 + .../tcl/tcl8.6/encoding/cp857.enc | 20 + .../tcl/tcl8.6/encoding/cp860.enc | 20 + .../tcl/tcl8.6/encoding/cp861.enc | 20 + .../tcl/tcl8.6/encoding/cp862.enc | 20 + .../tcl/tcl8.6/encoding/cp863.enc | 20 + .../tcl/tcl8.6/encoding/cp864.enc | 20 + .../tcl/tcl8.6/encoding/cp865.enc | 20 + .../tcl/tcl8.6/encoding/cp866.enc | 20 + .../tcl/tcl8.6/encoding/cp869.enc | 20 + .../tcl/tcl8.6/encoding/cp874.enc | 20 + .../tcl/tcl8.6/encoding/cp932.enc | 801 ++ .../tcl/tcl8.6/encoding/dingbats.enc | 20 + .../tcl/tcl8.6/encoding/ebcdic.enc | 19 + .../tcl/tcl8.6/encoding/gb1988.enc | 20 + .../tcl/tcl8.6/encoding/iso2022-jp.enc | 12 + .../tcl/tcl8.6/encoding/iso2022-kr.enc | 7 + .../tcl/tcl8.6/encoding/iso2022.enc | 14 + .../tcl/tcl8.6/encoding/iso8859-1.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-10.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-13.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-14.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-15.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-16.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-2.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-3.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-4.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-5.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-6.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-7.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-8.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-9.enc | 20 + .../tcl/tcl8.6/encoding/jis0201.enc | 20 + .../tcl/tcl8.6/encoding/koi8-r.enc | 20 + .../tcl/tcl8.6/encoding/koi8-u.enc | 20 + .../tcl/tcl8.6/encoding/macCentEuro.enc | 20 + .../tcl/tcl8.6/encoding/macCroatian.enc | 20 + .../tcl/tcl8.6/encoding/macCyrillic.enc | 20 + .../tcl/tcl8.6/encoding/macDingbats.enc | 20 + .../tcl/tcl8.6/encoding/macGreek.enc | 20 + .../tcl/tcl8.6/encoding/macIceland.enc | 20 + .../tcl/tcl8.6/encoding/macJapan.enc | 785 ++ .../tcl/tcl8.6/encoding/macRoman.enc | 20 + .../tcl/tcl8.6/encoding/macRomania.enc | 20 + .../tcl/tcl8.6/encoding/macThai.enc | 20 + .../tcl/tcl8.6/encoding/macTurkish.enc | 20 + .../tcl/tcl8.6/encoding/macUkraine.enc | 20 + .../tcl/tcl8.6/encoding/shiftjis.enc | 690 ++ .../tcl/tcl8.6/encoding/symbol.enc | 20 + .../tcl/tcl8.6/encoding/tis-620.enc | 20 + .../FlaskWebProject1/tcl/tcl8.6/history.tcl | 311 + .../tcl/tcl8.6/http1.0/http.tcl | 377 + .../tcl/tcl8.6/http1.0/pkgIndex.tcl | 11 + .../FlaskWebProject1/tcl/tcl8.6/init.tcl | 818 ++ .../FlaskWebProject1/tcl/tcl8.6/msgs/af.msg | 49 + .../tcl/tcl8.6/msgs/af_za.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ar.msg | 54 + .../tcl/tcl8.6/msgs/ar_in.msg | 6 + .../tcl/tcl8.6/msgs/ar_jo.msg | 39 + .../tcl/tcl8.6/msgs/ar_lb.msg | 39 + .../tcl/tcl8.6/msgs/ar_sy.msg | 39 + .../FlaskWebProject1/tcl/tcl8.6/msgs/be.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/bg.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/bn.msg | 49 + .../tcl/tcl8.6/msgs/bn_in.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ca.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/cs.msg | 54 + .../FlaskWebProject1/tcl/tcl8.6/msgs/da.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/de.msg | 54 + .../tcl/tcl8.6/msgs/de_at.msg | 35 + .../tcl/tcl8.6/msgs/de_be.msg | 53 + .../FlaskWebProject1/tcl/tcl8.6/msgs/el.msg | 52 + .../tcl/tcl8.6/msgs/en_au.msg | 7 + .../tcl/tcl8.6/msgs/en_be.msg | 7 + .../tcl/tcl8.6/msgs/en_bw.msg | 6 + .../tcl/tcl8.6/msgs/en_ca.msg | 7 + .../tcl/tcl8.6/msgs/en_gb.msg | 7 + .../tcl/tcl8.6/msgs/en_hk.msg | 8 + .../tcl/tcl8.6/msgs/en_ie.msg | 7 + .../tcl/tcl8.6/msgs/en_in.msg | 8 + .../tcl/tcl8.6/msgs/en_nz.msg | 7 + .../tcl/tcl8.6/msgs/en_ph.msg | 8 + .../tcl/tcl8.6/msgs/en_sg.msg | 6 + .../tcl/tcl8.6/msgs/en_za.msg | 6 + .../tcl/tcl8.6/msgs/en_zw.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/eo.msg | 54 + .../FlaskWebProject1/tcl/tcl8.6/msgs/es.msg | 52 + .../tcl/tcl8.6/msgs/es_ar.msg | 6 + .../tcl/tcl8.6/msgs/es_bo.msg | 6 + .../tcl/tcl8.6/msgs/es_cl.msg | 6 + .../tcl/tcl8.6/msgs/es_co.msg | 6 + .../tcl/tcl8.6/msgs/es_cr.msg | 6 + .../tcl/tcl8.6/msgs/es_do.msg | 6 + .../tcl/tcl8.6/msgs/es_ec.msg | 6 + .../tcl/tcl8.6/msgs/es_gt.msg | 6 + .../tcl/tcl8.6/msgs/es_hn.msg | 6 + .../tcl/tcl8.6/msgs/es_mx.msg | 6 + .../tcl/tcl8.6/msgs/es_ni.msg | 6 + .../tcl/tcl8.6/msgs/es_pa.msg | 6 + .../tcl/tcl8.6/msgs/es_pe.msg | 6 + .../tcl/tcl8.6/msgs/es_pr.msg | 6 + .../tcl/tcl8.6/msgs/es_py.msg | 6 + .../tcl/tcl8.6/msgs/es_sv.msg | 6 + .../tcl/tcl8.6/msgs/es_uy.msg | 6 + .../tcl/tcl8.6/msgs/es_ve.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/et.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/eu.msg | 47 + .../tcl/tcl8.6/msgs/eu_es.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/fa.msg | 47 + .../tcl/tcl8.6/msgs/fa_in.msg | 52 + .../tcl/tcl8.6/msgs/fa_ir.msg | 9 + .../FlaskWebProject1/tcl/tcl8.6/msgs/fi.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/fo.msg | 47 + .../tcl/tcl8.6/msgs/fo_fo.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/fr.msg | 52 + .../tcl/tcl8.6/msgs/fr_be.msg | 7 + .../tcl/tcl8.6/msgs/fr_ca.msg | 7 + .../tcl/tcl8.6/msgs/fr_ch.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ga.msg | 47 + .../tcl/tcl8.6/msgs/ga_ie.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/gl.msg | 47 + .../tcl/tcl8.6/msgs/gl_es.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/gv.msg | 47 + .../tcl/tcl8.6/msgs/gv_gb.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/he.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/hi.msg | 39 + .../tcl/tcl8.6/msgs/hi_in.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/hr.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/hu.msg | 54 + .../FlaskWebProject1/tcl/tcl8.6/msgs/id.msg | 47 + .../tcl/tcl8.6/msgs/id_id.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/is.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/it.msg | 54 + .../tcl/tcl8.6/msgs/it_ch.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ja.msg | 44 + .../FlaskWebProject1/tcl/tcl8.6/msgs/kl.msg | 47 + .../tcl/tcl8.6/msgs/kl_gl.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ko.msg | 55 + .../tcl/tcl8.6/msgs/ko_kr.msg | 8 + .../FlaskWebProject1/tcl/tcl8.6/msgs/kok.msg | 39 + .../tcl/tcl8.6/msgs/kok_in.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/kw.msg | 47 + .../tcl/tcl8.6/msgs/kw_gb.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/lt.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/lv.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/mk.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/mr.msg | 39 + .../tcl/tcl8.6/msgs/mr_in.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ms.msg | 47 + .../tcl/tcl8.6/msgs/ms_my.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/mt.msg | 27 + .../FlaskWebProject1/tcl/tcl8.6/msgs/nb.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/nl.msg | 50 + .../tcl/tcl8.6/msgs/nl_be.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/nn.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/pl.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/pt.msg | 50 + .../tcl/tcl8.6/msgs/pt_br.msg | 7 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ro.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ru.msg | 52 + .../tcl/tcl8.6/msgs/ru_ua.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sh.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sk.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sl.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sq.msg | 54 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sr.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sv.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/sw.msg | 49 + .../FlaskWebProject1/tcl/tcl8.6/msgs/ta.msg | 39 + .../tcl/tcl8.6/msgs/ta_in.msg | 6 + .../FlaskWebProject1/tcl/tcl8.6/msgs/te.msg | 47 + .../tcl/tcl8.6/msgs/te_in.msg | 8 + .../FlaskWebProject1/tcl/tcl8.6/msgs/th.msg | 54 + .../FlaskWebProject1/tcl/tcl8.6/msgs/tr.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/uk.msg | 52 + .../FlaskWebProject1/tcl/tcl8.6/msgs/vi.msg | 50 + .../FlaskWebProject1/tcl/tcl8.6/msgs/zh.msg | 55 + .../tcl/tcl8.6/msgs/zh_cn.msg | 7 + .../tcl/tcl8.6/msgs/zh_hk.msg | 28 + .../tcl/tcl8.6/msgs/zh_sg.msg | 8 + .../tcl/tcl8.6/msgs/zh_tw.msg | 8 + .../tcl/tcl8.6/opt0.4/optparse.tcl | 1072 ++ .../tcl/tcl8.6/opt0.4/pkgIndex.tcl | 12 + .../FlaskWebProject1/tcl/tcl8.6/package.tcl | 747 ++ .../FlaskWebProject1/tcl/tcl8.6/parray.tcl | 28 + .../FlaskWebProject1/tcl/tcl8.6/safe.tcl | 1133 ++ .../FlaskWebProject1/tcl/tcl8.6/tclIndex | 75 + .../FlaskWebProject1/tcl/tcl8.6/tm.tcl | 375 + .../tcl/tcl8.6/tzdata/Africa/Abidjan | 6 + .../tcl/tcl8.6/tzdata/Africa/Accra | 52 + .../tcl/tcl8.6/tzdata/Africa/Addis_Ababa | 5 + .../tcl/tcl8.6/tzdata/Africa/Algiers | 39 + .../tcl/tcl8.6/tzdata/Africa/Asmara | 5 + .../tcl/tcl8.6/tzdata/Africa/Asmera | 5 + .../tcl/tcl8.6/tzdata/Africa/Bamako | 5 + .../tcl/tcl8.6/tzdata/Africa/Bangui | 5 + .../tcl/tcl8.6/tzdata/Africa/Banjul | 5 + .../tcl/tcl8.6/tzdata/Africa/Bissau | 7 + .../tcl/tcl8.6/tzdata/Africa/Blantyre | 5 + .../tcl/tcl8.6/tzdata/Africa/Brazzaville | 5 + .../tcl/tcl8.6/tzdata/Africa/Bujumbura | 5 + .../tcl/tcl8.6/tzdata/Africa/Cairo | 132 + .../tcl/tcl8.6/tzdata/Africa/Casablanca | 230 + .../tcl/tcl8.6/tzdata/Africa/Ceuta | 258 + .../tcl/tcl8.6/tzdata/Africa/Conakry | 5 + .../tcl/tcl8.6/tzdata/Africa/Dakar | 5 + .../tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam | 5 + .../tcl/tcl8.6/tzdata/Africa/Djibouti | 5 + .../tcl/tcl8.6/tzdata/Africa/Douala | 5 + .../tcl/tcl8.6/tzdata/Africa/El_Aaiun | 219 + .../tcl/tcl8.6/tzdata/Africa/Freetown | 5 + .../tcl/tcl8.6/tzdata/Africa/Gaborone | 5 + .../tcl/tcl8.6/tzdata/Africa/Harare | 5 + .../tcl/tcl8.6/tzdata/Africa/Johannesburg | 11 + .../tcl/tcl8.6/tzdata/Africa/Juba | 5 + .../tcl/tcl8.6/tzdata/Africa/Kampala | 5 + .../tcl/tcl8.6/tzdata/Africa/Khartoum | 39 + .../tcl/tcl8.6/tzdata/Africa/Kigali | 5 + .../tcl/tcl8.6/tzdata/Africa/Kinshasa | 5 + .../tcl/tcl8.6/tzdata/Africa/Lagos | 6 + .../tcl/tcl8.6/tzdata/Africa/Libreville | 5 + .../tcl/tcl8.6/tzdata/Africa/Lome | 5 + .../tcl/tcl8.6/tzdata/Africa/Luanda | 5 + .../tcl/tcl8.6/tzdata/Africa/Lubumbashi | 5 + .../tcl/tcl8.6/tzdata/Africa/Lusaka | 5 + .../tcl/tcl8.6/tzdata/Africa/Malabo | 5 + .../tcl/tcl8.6/tzdata/Africa/Maputo | 6 + .../tcl/tcl8.6/tzdata/Africa/Maseru | 5 + .../tcl/tcl8.6/tzdata/Africa/Mbabane | 5 + .../tcl/tcl8.6/tzdata/Africa/Mogadishu | 5 + .../tcl/tcl8.6/tzdata/Africa/Monrovia | 8 + .../tcl/tcl8.6/tzdata/Africa/Nairobi | 9 + .../tcl/tcl8.6/tzdata/Africa/Ndjamena | 8 + .../tcl/tcl8.6/tzdata/Africa/Niamey | 5 + .../tcl/tcl8.6/tzdata/Africa/Nouakchott | 5 + .../tcl/tcl8.6/tzdata/Africa/Ouagadougou | 5 + .../tcl/tcl8.6/tzdata/Africa/Porto-Novo | 5 + .../tcl/tcl8.6/tzdata/Africa/Sao_Tome | 5 + .../tcl/tcl8.6/tzdata/Africa/Timbuktu | 5 + .../tcl/tcl8.6/tzdata/Africa/Tripoli | 34 + .../tcl/tcl8.6/tzdata/Africa/Tunis | 39 + .../tcl/tcl8.6/tzdata/Africa/Windhoek | 222 + .../tcl/tcl8.6/tzdata/America/Adak | 276 + .../tcl/tcl8.6/tzdata/America/Anchorage | 276 + .../tcl/tcl8.6/tzdata/America/Anguilla | 5 + .../tcl/tcl8.6/tzdata/America/Antigua | 5 + .../tcl/tcl8.6/tzdata/America/Araguaina | 60 + .../tzdata/America/Argentina/Buenos_Aires | 67 + .../tcl8.6/tzdata/America/Argentina/Catamarca | 68 + .../tzdata/America/Argentina/ComodRivadavia | 5 + .../tcl8.6/tzdata/America/Argentina/Cordoba | 67 + .../tcl/tcl8.6/tzdata/America/Argentina/Jujuy | 67 + .../tcl8.6/tzdata/America/Argentina/La_Rioja | 69 + .../tcl8.6/tzdata/America/Argentina/Mendoza | 68 + .../tzdata/America/Argentina/Rio_Gallegos | 68 + .../tcl/tcl8.6/tzdata/America/Argentina/Salta | 66 + .../tcl8.6/tzdata/America/Argentina/San_Juan | 69 + .../tcl8.6/tzdata/America/Argentina/San_Luis | 68 + .../tcl8.6/tzdata/America/Argentina/Tucuman | 69 + .../tcl8.6/tzdata/America/Argentina/Ushuaia | 68 + .../tcl/tcl8.6/tzdata/America/Aruba | 5 + .../tcl/tcl8.6/tzdata/America/Asuncion | 259 + .../tcl/tcl8.6/tzdata/America/Atikokan | 12 + .../tcl/tcl8.6/tzdata/America/Atka | 5 + .../tcl/tcl8.6/tzdata/America/Bahia | 68 + .../tcl/tcl8.6/tzdata/America/Bahia_Banderas | 222 + .../tcl/tcl8.6/tzdata/America/Barbados | 15 + .../tcl/tcl8.6/tzdata/America/Belem | 35 + .../tcl/tcl8.6/tzdata/America/Belize | 60 + .../tcl/tcl8.6/tzdata/America/Blanc-Sablon | 12 + .../tcl/tcl8.6/tzdata/America/Boa_Vista | 40 + .../tcl/tcl8.6/tzdata/America/Bogota | 9 + .../tcl/tcl8.6/tzdata/America/Boise | 281 + .../tcl/tcl8.6/tzdata/America/Buenos_Aires | 5 + .../tcl/tcl8.6/tzdata/America/Cambridge_Bay | 252 + .../tcl/tcl8.6/tzdata/America/Campo_Grande | 257 + .../tcl/tcl8.6/tzdata/America/Cancun | 47 + .../tcl/tcl8.6/tzdata/America/Caracas | 10 + .../tcl/tcl8.6/tzdata/America/Catamarca | 5 + .../tcl/tcl8.6/tzdata/America/Cayenne | 7 + .../tcl/tcl8.6/tzdata/America/Cayman | 5 + .../tcl/tcl8.6/tzdata/America/Chicago | 369 + .../tcl/tcl8.6/tzdata/America/Chihuahua | 221 + .../tcl/tcl8.6/tzdata/America/Coral_Harbour | 5 + .../tcl/tcl8.6/tzdata/America/Cordoba | 5 + .../tcl/tcl8.6/tzdata/America/Costa_Rica | 15 + .../tcl/tcl8.6/tzdata/America/Creston | 8 + .../tcl/tcl8.6/tzdata/America/Cuiaba | 257 + .../tcl/tcl8.6/tzdata/America/Curacao | 7 + .../tcl/tcl8.6/tzdata/America/Danmarkshavn | 39 + .../tcl/tcl8.6/tzdata/America/Dawson | 256 + .../tcl/tcl8.6/tzdata/America/Dawson_Creek | 64 + .../tcl/tcl8.6/tzdata/America/Denver | 291 + .../tcl/tcl8.6/tzdata/America/Detroit | 272 + .../tcl/tcl8.6/tzdata/America/Dominica | 5 + .../tcl/tcl8.6/tzdata/America/Edmonton | 284 + .../tcl/tcl8.6/tzdata/America/Eirunepe | 41 + .../tcl/tcl8.6/tzdata/America/El_Salvador | 10 + .../tcl/tcl8.6/tzdata/America/Ensenada | 5 + .../tcl/tcl8.6/tzdata/America/Fort_Nelson | 151 + .../tcl/tcl8.6/tzdata/America/Fort_Wayne | 5 + .../tcl/tcl8.6/tzdata/America/Fortaleza | 48 + .../tcl/tcl8.6/tzdata/America/Glace_Bay | 273 + .../tcl/tcl8.6/tzdata/America/Godthab | 246 + .../tcl/tcl8.6/tzdata/America/Goose_Bay | 338 + .../tcl/tcl8.6/tzdata/America/Grand_Turk | 82 + .../tcl/tcl8.6/tzdata/America/Grenada | 5 + .../tcl/tcl8.6/tzdata/America/Guadeloupe | 5 + .../tcl/tcl8.6/tzdata/America/Guatemala | 14 + .../tcl/tcl8.6/tzdata/America/Guayaquil | 7 + .../tcl/tcl8.6/tzdata/America/Guyana | 9 + .../tcl/tcl8.6/tzdata/America/Halifax | 361 + .../tcl/tcl8.6/tzdata/America/Havana | 285 + .../tcl/tcl8.6/tzdata/America/Hermosillo | 21 + .../tzdata/America/Indiana/Indianapolis | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Knox | 285 + .../tcl/tcl8.6/tzdata/America/Indiana/Marengo | 236 + .../tcl8.6/tzdata/America/Indiana/Petersburg | 247 + .../tcl8.6/tzdata/America/Indiana/Tell_City | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Vevay | 213 + .../tcl8.6/tzdata/America/Indiana/Vincennes | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Winamac | 240 + .../tcl/tcl8.6/tzdata/America/Indianapolis | 5 + .../tcl/tcl8.6/tzdata/America/Inuvik | 249 + .../tcl/tcl8.6/tzdata/America/Iqaluit | 250 + .../tcl/tcl8.6/tzdata/America/Jamaica | 29 + .../tcl/tcl8.6/tzdata/America/Jujuy | 5 + .../tcl/tcl8.6/tzdata/America/Juneau | 276 + .../tcl8.6/tzdata/America/Kentucky/Louisville | 314 + .../tcl8.6/tzdata/America/Kentucky/Monticello | 279 + .../tcl/tcl8.6/tzdata/America/Knox_IN | 5 + .../tcl/tcl8.6/tzdata/America/Kralendijk | 5 + .../tcl/tcl8.6/tzdata/America/La_Paz | 8 + .../tcl/tcl8.6/tzdata/America/Lima | 16 + .../tcl/tcl8.6/tzdata/America/Los_Angeles | 317 + .../tcl/tcl8.6/tzdata/America/Louisville | 5 + .../tcl/tcl8.6/tzdata/America/Lower_Princes | 5 + .../tcl/tcl8.6/tzdata/America/Maceio | 52 + .../tcl/tcl8.6/tzdata/America/Managua | 21 + .../tcl/tcl8.6/tzdata/America/Manaus | 39 + .../tcl/tcl8.6/tzdata/America/Marigot | 5 + .../tcl/tcl8.6/tzdata/America/Martinique | 9 + .../tcl/tcl8.6/tzdata/America/Matamoros | 219 + .../tcl/tcl8.6/tzdata/America/Mazatlan | 222 + .../tcl/tcl8.6/tzdata/America/Mendoza | 5 + .../tcl/tcl8.6/tzdata/America/Menominee | 274 + .../tcl/tcl8.6/tzdata/America/Merida | 216 + .../tcl/tcl8.6/tzdata/America/Metlakatla | 212 + .../tcl/tcl8.6/tzdata/America/Mexico_City | 228 + .../tcl/tcl8.6/tzdata/America/Miquelon | 234 + .../tcl/tcl8.6/tzdata/America/Moncton | 342 + .../tcl/tcl8.6/tzdata/America/Monterrey | 218 + .../tcl/tcl8.6/tzdata/America/Montevideo | 92 + .../tcl/tcl8.6/tzdata/America/Montreal | 5 + .../tcl/tcl8.6/tzdata/America/Montserrat | 5 + .../tcl/tcl8.6/tzdata/America/Nassau | 279 + .../tcl/tcl8.6/tzdata/America/New_York | 369 + .../tcl/tcl8.6/tzdata/America/Nipigon | 264 + .../tcl/tcl8.6/tzdata/America/Nome | 276 + .../tcl/tcl8.6/tzdata/America/Noronha | 48 + .../tcl8.6/tzdata/America/North_Dakota/Beulah | 279 + .../tcl8.6/tzdata/America/North_Dakota/Center | 279 + .../tzdata/America/North_Dakota/New_Salem | 279 + .../tcl/tcl8.6/tzdata/America/Ojinaga | 222 + .../tcl/tcl8.6/tzdata/America/Panama | 7 + .../tcl/tcl8.6/tzdata/America/Pangnirtung | 252 + .../tcl/tcl8.6/tzdata/America/Paramaribo | 10 + .../tcl/tcl8.6/tzdata/America/Phoenix | 17 + .../tcl/tcl8.6/tzdata/America/Port-au-Prince | 49 + .../tcl/tcl8.6/tzdata/America/Port_of_Spain | 6 + .../tcl/tcl8.6/tzdata/America/Porto_Acre | 5 + .../tcl/tcl8.6/tzdata/America/Porto_Velho | 35 + .../tcl/tcl8.6/tzdata/America/Puerto_Rico | 10 + .../tcl/tcl8.6/tzdata/America/Rainy_River | 264 + .../tcl/tcl8.6/tzdata/America/Rankin_Inlet | 248 + .../tcl/tcl8.6/tzdata/America/Recife | 48 + .../tcl/tcl8.6/tzdata/America/Regina | 58 + .../tcl/tcl8.6/tzdata/America/Resolute | 248 + .../tcl/tcl8.6/tzdata/America/Rio_Branco | 37 + .../tcl/tcl8.6/tzdata/America/Rosario | 5 + .../tcl/tcl8.6/tzdata/America/Santa_Isabel | 5 + .../tcl/tcl8.6/tzdata/America/Santarem | 36 + .../tcl/tcl8.6/tzdata/America/Santiago | 289 + .../tcl/tcl8.6/tzdata/America/Santo_Domingo | 21 + .../tcl/tcl8.6/tzdata/America/Sao_Paulo | 258 + .../tcl/tcl8.6/tzdata/America/Scoresbysund | 246 + .../tcl/tcl8.6/tzdata/America/Shiprock | 5 + .../tcl/tcl8.6/tzdata/America/Sitka | 275 + .../tcl/tcl8.6/tzdata/America/St_Barthelemy | 5 + .../tcl/tcl8.6/tzdata/America/St_Johns | 372 + .../tcl/tcl8.6/tzdata/America/St_Kitts | 5 + .../tcl/tcl8.6/tzdata/America/St_Lucia | 5 + .../tcl/tcl8.6/tzdata/America/St_Thomas | 5 + .../tcl/tcl8.6/tzdata/America/St_Vincent | 5 + .../tcl/tcl8.6/tzdata/America/Swift_Current | 29 + .../tcl/tcl8.6/tzdata/America/Tegucigalpa | 12 + .../tcl/tcl8.6/tzdata/America/Thule | 224 + .../tcl/tcl8.6/tzdata/America/Thunder_Bay | 272 + .../tcl/tcl8.6/tzdata/America/Tijuana | 285 + .../tcl/tcl8.6/tzdata/America/Toronto | 365 + .../tcl/tcl8.6/tzdata/America/Tortola | 5 + .../tcl/tcl8.6/tzdata/America/Vancouver | 320 + .../tcl/tcl8.6/tzdata/America/Virgin | 5 + .../tcl/tcl8.6/tzdata/America/Whitehorse | 256 + .../tcl/tcl8.6/tzdata/America/Winnipeg | 316 + .../tcl/tcl8.6/tzdata/America/Yakutat | 276 + .../tcl/tcl8.6/tzdata/America/Yellowknife | 252 + .../tcl/tcl8.6/tzdata/Antarctica/Casey | 10 + .../tcl/tcl8.6/tzdata/Antarctica/Davis | 12 + .../tcl8.6/tzdata/Antarctica/DumontDUrville | 8 + .../tcl/tcl8.6/tzdata/Antarctica/Macquarie | 97 + .../tcl/tcl8.6/tzdata/Antarctica/Mawson | 7 + .../tcl/tcl8.6/tzdata/Antarctica/McMurdo | 5 + .../tcl/tcl8.6/tzdata/Antarctica/Palmer | 252 + .../tcl/tcl8.6/tzdata/Antarctica/Rothera | 6 + .../tcl/tcl8.6/tzdata/Antarctica/South_Pole | 5 + .../tcl/tcl8.6/tzdata/Antarctica/Syowa | 6 + .../tcl/tcl8.6/tzdata/Antarctica/Troll | 196 + .../tcl/tcl8.6/tzdata/Antarctica/Vostok | 6 + .../tcl/tcl8.6/tzdata/Arctic/Longyearbyen | 5 + .../tcl/tcl8.6/tzdata/Asia/Aden | 5 + .../tcl/tcl8.6/tzdata/Asia/Almaty | 57 + .../tcl/tcl8.6/tzdata/Asia/Amman | 246 + .../tcl/tcl8.6/tzdata/Asia/Anadyr | 72 + .../tcl/tcl8.6/tzdata/Asia/Aqtau | 59 + .../tcl/tcl8.6/tzdata/Asia/Aqtobe | 58 + .../tcl/tcl8.6/tzdata/Asia/Ashgabat | 31 + .../tcl/tcl8.6/tzdata/Asia/Ashkhabad | 5 + .../tcl/tcl8.6/tzdata/Asia/Baghdad | 59 + .../tcl/tcl8.6/tzdata/Asia/Bahrain | 5 + .../tcl/tcl8.6/tzdata/Asia/Baku | 74 + .../tcl/tcl8.6/tzdata/Asia/Bangkok | 7 + .../tcl/tcl8.6/tzdata/Asia/Barnaul | 73 + .../tcl/tcl8.6/tzdata/Asia/Beirut | 270 + .../tcl/tcl8.6/tzdata/Asia/Bishkek | 57 + .../tcl/tcl8.6/tzdata/Asia/Brunei | 7 + .../tcl/tcl8.6/tzdata/Asia/Calcutta | 5 + .../tcl/tcl8.6/tzdata/Asia/Chita | 72 + .../tcl/tcl8.6/tzdata/Asia/Choibalsan | 222 + .../tcl/tcl8.6/tzdata/Asia/Chongqing | 5 + .../tcl/tcl8.6/tzdata/Asia/Chungking | 5 + .../tcl/tcl8.6/tzdata/Asia/Colombo | 13 + .../tcl/tcl8.6/tzdata/Asia/Dacca | 5 + .../tcl/tcl8.6/tzdata/Asia/Damascus | 280 + .../tcl/tcl8.6/tzdata/Asia/Dhaka | 14 + .../tcl/tcl8.6/tzdata/Asia/Dili | 10 + .../tcl/tcl8.6/tzdata/Asia/Dubai | 6 + .../tcl/tcl8.6/tzdata/Asia/Dushanbe | 29 + .../tcl/tcl8.6/tzdata/Asia/Gaza | 278 + .../tcl/tcl8.6/tzdata/Asia/Harbin | 5 + .../tcl/tcl8.6/tzdata/Asia/Hebron | 277 + .../tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh | 14 + .../tcl/tcl8.6/tzdata/Asia/Hong_Kong | 75 + .../tcl/tcl8.6/tzdata/Asia/Hovd | 221 + .../tcl/tcl8.6/tzdata/Asia/Irkutsk | 72 + .../tcl/tcl8.6/tzdata/Asia/Istanbul | 5 + .../tcl/tcl8.6/tzdata/Asia/Jakarta | 13 + .../tcl/tcl8.6/tzdata/Asia/Jayapura | 8 + .../tcl/tcl8.6/tzdata/Asia/Jerusalem | 272 + .../tcl/tcl8.6/tzdata/Asia/Kabul | 7 + .../tcl/tcl8.6/tzdata/Asia/Kamchatka | 71 + .../tcl/tcl8.6/tzdata/Asia/Karachi | 16 + .../tcl/tcl8.6/tzdata/Asia/Kashgar | 5 + .../tcl/tcl8.6/tzdata/Asia/Kathmandu | 7 + .../tcl/tcl8.6/tzdata/Asia/Katmandu | 5 + .../tcl/tcl8.6/tzdata/Asia/Khandyga | 73 + .../tcl/tcl8.6/tzdata/Asia/Kolkata | 10 + .../tcl/tcl8.6/tzdata/Asia/Krasnoyarsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur | 13 + .../tcl/tcl8.6/tzdata/Asia/Kuching | 24 + .../tcl/tcl8.6/tzdata/Asia/Kuwait | 5 + .../tcl/tcl8.6/tzdata/Asia/Macao | 5 + .../tcl/tcl8.6/tzdata/Asia/Macau | 46 + .../tcl/tcl8.6/tzdata/Asia/Magadan | 72 + .../tcl/tcl8.6/tzdata/Asia/Makassar | 9 + .../tcl/tcl8.6/tzdata/Asia/Manila | 15 + .../tcl/tcl8.6/tzdata/Asia/Muscat | 5 + .../tcl/tcl8.6/tzdata/Asia/Nicosia | 257 + .../tcl/tcl8.6/tzdata/Asia/Novokuznetsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Novosibirsk | 73 + .../tcl/tcl8.6/tzdata/Asia/Omsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Oral | 58 + .../tcl/tcl8.6/tzdata/Asia/Phnom_Penh | 5 + .../tcl/tcl8.6/tzdata/Asia/Pontianak | 13 + .../tcl/tcl8.6/tzdata/Asia/Pyongyang | 10 + .../tcl/tcl8.6/tzdata/Asia/Qatar | 7 + .../tcl/tcl8.6/tzdata/Asia/Qyzylorda | 57 + .../tcl/tcl8.6/tzdata/Asia/Rangoon | 9 + .../tcl/tcl8.6/tzdata/Asia/Riyadh | 6 + .../tcl/tcl8.6/tzdata/Asia/Saigon | 5 + .../tcl/tcl8.6/tzdata/Asia/Sakhalin | 74 + .../tcl/tcl8.6/tzdata/Asia/Samarkand | 32 + .../tcl/tcl8.6/tzdata/Asia/Seoul | 27 + .../tcl/tcl8.6/tzdata/Asia/Shanghai | 23 + .../tcl/tcl8.6/tzdata/Asia/Singapore | 14 + .../tcl/tcl8.6/tzdata/Asia/Srednekolymsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Taipei | 46 + .../tcl/tcl8.6/tzdata/Asia/Tashkent | 32 + .../tcl/tcl8.6/tzdata/Asia/Tbilisi | 60 + .../tcl/tcl8.6/tzdata/Asia/Tehran | 229 + .../tcl/tcl8.6/tzdata/Asia/Tel_Aviv | 5 + .../tcl/tcl8.6/tzdata/Asia/Thimbu | 5 + .../tcl/tcl8.6/tzdata/Asia/Thimphu | 7 + .../tcl/tcl8.6/tzdata/Asia/Tokyo | 16 + .../tcl/tcl8.6/tzdata/Asia/Tomsk | 73 + .../tcl/tcl8.6/tzdata/Asia/Ujung_Pandang | 5 + .../tcl/tcl8.6/tzdata/Asia/Ulaanbaatar | 221 + .../tcl/tcl8.6/tzdata/Asia/Ulan_Bator | 5 + .../tcl/tcl8.6/tzdata/Asia/Urumqi | 6 + .../tcl/tcl8.6/tzdata/Asia/Ust-Nera | 71 + .../tcl/tcl8.6/tzdata/Asia/Vientiane | 5 + .../tcl/tcl8.6/tzdata/Asia/Vladivostok | 71 + .../tcl/tcl8.6/tzdata/Asia/Yakutsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Yekaterinburg | 72 + .../tcl/tcl8.6/tzdata/Asia/Yerevan | 70 + .../tcl/tcl8.6/tzdata/Atlantic/Azores | 349 + .../tcl/tcl8.6/tzdata/Atlantic/Bermuda | 259 + .../tcl/tcl8.6/tzdata/Atlantic/Canary | 247 + .../tcl/tcl8.6/tzdata/Atlantic/Cape_Verde | 9 + .../tcl/tcl8.6/tzdata/Atlantic/Faeroe | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Faroe | 245 + .../tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Madeira | 350 + .../tcl/tcl8.6/tzdata/Atlantic/Reykjavik | 73 + .../tcl/tcl8.6/tzdata/Atlantic/South_Georgia | 6 + .../tcl/tcl8.6/tzdata/Atlantic/St_Helena | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Stanley | 75 + .../tcl/tcl8.6/tzdata/Australia/ACT | 5 + .../tcl/tcl8.6/tzdata/Australia/Adelaide | 273 + .../tcl/tcl8.6/tzdata/Australia/Brisbane | 23 + .../tcl/tcl8.6/tzdata/Australia/Broken_Hill | 275 + .../tcl/tcl8.6/tzdata/Australia/Canberra | 5 + .../tcl/tcl8.6/tzdata/Australia/Currie | 273 + .../tcl/tcl8.6/tzdata/Australia/Darwin | 15 + .../tcl/tcl8.6/tzdata/Australia/Eucla | 25 + .../tcl/tcl8.6/tzdata/Australia/Hobart | 281 + .../tcl/tcl8.6/tzdata/Australia/LHI | 5 + .../tcl/tcl8.6/tzdata/Australia/Lindeman | 28 + .../tcl/tcl8.6/tzdata/Australia/Lord_Howe | 244 + .../tcl/tcl8.6/tzdata/Australia/Melbourne | 272 + .../tcl/tcl8.6/tzdata/Australia/NSW | 5 + .../tcl/tcl8.6/tzdata/Australia/North | 5 + .../tcl/tcl8.6/tzdata/Australia/Perth | 25 + .../tcl/tcl8.6/tzdata/Australia/Queensland | 5 + .../tcl/tcl8.6/tzdata/Australia/South | 5 + .../tcl/tcl8.6/tzdata/Australia/Sydney | 272 + .../tcl/tcl8.6/tzdata/Australia/Tasmania | 5 + .../tcl/tcl8.6/tzdata/Australia/Victoria | 5 + .../tcl/tcl8.6/tzdata/Australia/West | 5 + .../tcl/tcl8.6/tzdata/Australia/Yancowinna | 5 + .../tcl/tcl8.6/tzdata/Brazil/Acre | 5 + .../tcl/tcl8.6/tzdata/Brazil/DeNoronha | 5 + .../tcl/tcl8.6/tzdata/Brazil/East | 5 + .../tcl/tcl8.6/tzdata/Brazil/West | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/CET | 265 + .../tcl/tcl8.6/tzdata/CST6CDT | 278 + .../tcl/tcl8.6/tzdata/Canada/Atlantic | 5 + .../tcl/tcl8.6/tzdata/Canada/Central | 5 + .../tcl8.6/tzdata/Canada/East-Saskatchewan | 5 + .../tcl/tcl8.6/tzdata/Canada/Eastern | 5 + .../tcl/tcl8.6/tzdata/Canada/Mountain | 5 + .../tcl/tcl8.6/tzdata/Canada/Newfoundland | 5 + .../tcl/tcl8.6/tzdata/Canada/Pacific | 5 + .../tcl/tcl8.6/tzdata/Canada/Saskatchewan | 5 + .../tcl/tcl8.6/tzdata/Canada/Yukon | 5 + .../tcl/tcl8.6/tzdata/Chile/Continental | 5 + .../tcl/tcl8.6/tzdata/Chile/EasterIsland | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Cuba | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/EET | 251 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/EST | 5 + .../tcl/tcl8.6/tzdata/EST5EDT | 278 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Egypt | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Eire | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+0 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+1 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+10 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+11 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+12 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+2 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+3 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+4 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+5 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+6 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+7 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+8 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT+9 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-0 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-1 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-10 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-11 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-12 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-13 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-14 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-2 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-3 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-4 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-5 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-6 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-7 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-8 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT-9 | 5 + .../tcl/tcl8.6/tzdata/Etc/GMT0 | 5 + .../tcl/tcl8.6/tzdata/Etc/Greenwich | 5 + .../tcl/tcl8.6/tzdata/Etc/UCT | 5 + .../tcl/tcl8.6/tzdata/Etc/UTC | 5 + .../tcl/tcl8.6/tzdata/Etc/Universal | 5 + .../tcl/tcl8.6/tzdata/Etc/Zulu | 5 + .../tcl/tcl8.6/tzdata/Europe/Amsterdam | 310 + .../tcl/tcl8.6/tzdata/Europe/Andorra | 237 + .../tcl/tcl8.6/tzdata/Europe/Astrakhan | 71 + .../tcl/tcl8.6/tzdata/Europe/Athens | 268 + .../tcl/tcl8.6/tzdata/Europe/Belfast | 5 + .../tcl/tcl8.6/tzdata/Europe/Belgrade | 250 + .../tcl/tcl8.6/tzdata/Europe/Berlin | 274 + .../tcl/tcl8.6/tzdata/Europe/Bratislava | 5 + .../tcl/tcl8.6/tzdata/Europe/Brussels | 316 + .../tcl/tcl8.6/tzdata/Europe/Bucharest | 268 + .../tcl/tcl8.6/tzdata/Europe/Budapest | 282 + .../tcl/tcl8.6/tzdata/Europe/Busingen | 5 + .../tcl/tcl8.6/tzdata/Europe/Chisinau | 272 + .../tcl/tcl8.6/tzdata/Europe/Copenhagen | 264 + .../tcl/tcl8.6/tzdata/Europe/Dublin | 359 + .../tcl/tcl8.6/tzdata/Europe/Gibraltar | 328 + .../tcl/tcl8.6/tzdata/Europe/Guernsey | 5 + .../tcl/tcl8.6/tzdata/Europe/Helsinki | 248 + .../tcl/tcl8.6/tzdata/Europe/Isle_of_Man | 5 + .../tcl/tcl8.6/tzdata/Europe/Istanbul | 306 + .../tcl/tcl8.6/tzdata/Europe/Jersey | 5 + .../tcl/tcl8.6/tzdata/Europe/Kaliningrad | 85 + .../tcl/tcl8.6/tzdata/Europe/Kiev | 251 + .../tcl/tcl8.6/tzdata/Europe/Kirov | 70 + .../tcl/tcl8.6/tzdata/Europe/Lisbon | 351 + .../tcl/tcl8.6/tzdata/Europe/Ljubljana | 5 + .../tcl/tcl8.6/tzdata/Europe/London | 372 + .../tcl/tcl8.6/tzdata/Europe/Luxembourg | 313 + .../tcl/tcl8.6/tzdata/Europe/Madrid | 294 + .../tcl/tcl8.6/tzdata/Europe/Malta | 299 + .../tcl/tcl8.6/tzdata/Europe/Mariehamn | 5 + .../tcl/tcl8.6/tzdata/Europe/Minsk | 76 + .../tcl/tcl8.6/tzdata/Europe/Monaco | 315 + .../tcl/tcl8.6/tzdata/Europe/Moscow | 83 + .../tcl/tcl8.6/tzdata/Europe/Nicosia | 5 + .../tcl/tcl8.6/tzdata/Europe/Oslo | 271 + .../tcl/tcl8.6/tzdata/Europe/Paris | 314 + .../tcl/tcl8.6/tzdata/Europe/Podgorica | 5 + .../tcl/tcl8.6/tzdata/Europe/Prague | 272 + .../tcl/tcl8.6/tzdata/Europe/Riga | 258 + .../tcl/tcl8.6/tzdata/Europe/Rome | 301 + .../tcl/tcl8.6/tzdata/Europe/Samara | 73 + .../tcl/tcl8.6/tzdata/Europe/San_Marino | 5 + .../tcl/tcl8.6/tzdata/Europe/Sarajevo | 5 + .../tcl/tcl8.6/tzdata/Europe/Simferopol | 82 + .../tcl/tcl8.6/tzdata/Europe/Skopje | 5 + .../tcl/tcl8.6/tzdata/Europe/Sofia | 258 + .../tcl/tcl8.6/tzdata/Europe/Stockholm | 250 + .../tcl/tcl8.6/tzdata/Europe/Tallinn | 254 + .../tcl/tcl8.6/tzdata/Europe/Tirane | 263 + .../tcl/tcl8.6/tzdata/Europe/Tiraspol | 5 + .../tcl/tcl8.6/tzdata/Europe/Ulyanovsk | 73 + .../tcl/tcl8.6/tzdata/Europe/Uzhgorod | 254 + .../tcl/tcl8.6/tzdata/Europe/Vaduz | 5 + .../tcl/tcl8.6/tzdata/Europe/Vatican | 5 + .../tcl/tcl8.6/tzdata/Europe/Vienna | 271 + .../tcl/tcl8.6/tzdata/Europe/Vilnius | 252 + .../tcl/tcl8.6/tzdata/Europe/Volgograd | 72 + .../tcl/tcl8.6/tzdata/Europe/Warsaw | 296 + .../tcl/tcl8.6/tzdata/Europe/Zagreb | 5 + .../tcl/tcl8.6/tzdata/Europe/Zaporozhye | 252 + .../tcl/tcl8.6/tzdata/Europe/Zurich | 250 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/GB | 5 + .../tcl/tcl8.6/tzdata/GB-Eire | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/GMT | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/GMT+0 | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/GMT-0 | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/GMT0 | 5 + .../tcl/tcl8.6/tzdata/Greenwich | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/HST | 5 + .../tcl/tcl8.6/tzdata/Hongkong | 5 + .../tcl/tcl8.6/tzdata/Iceland | 5 + .../tcl/tcl8.6/tzdata/Indian/Antananarivo | 5 + .../tcl/tcl8.6/tzdata/Indian/Chagos | 7 + .../tcl/tcl8.6/tzdata/Indian/Christmas | 6 + .../tcl/tcl8.6/tzdata/Indian/Cocos | 6 + .../tcl/tcl8.6/tzdata/Indian/Comoro | 5 + .../tcl/tcl8.6/tzdata/Indian/Kerguelen | 6 + .../tcl/tcl8.6/tzdata/Indian/Mahe | 6 + .../tcl/tcl8.6/tzdata/Indian/Maldives | 7 + .../tcl/tcl8.6/tzdata/Indian/Mauritius | 10 + .../tcl/tcl8.6/tzdata/Indian/Mayotte | 5 + .../tcl/tcl8.6/tzdata/Indian/Reunion | 6 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Iran | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Israel | 5 + .../tcl/tcl8.6/tzdata/Jamaica | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Japan | 5 + .../tcl/tcl8.6/tzdata/Kwajalein | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Libya | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/MET | 265 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/MST | 5 + .../tcl/tcl8.6/tzdata/MST7MDT | 278 + .../tcl/tcl8.6/tzdata/Mexico/BajaNorte | 5 + .../tcl/tcl8.6/tzdata/Mexico/BajaSur | 5 + .../tcl/tcl8.6/tzdata/Mexico/General | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/NZ | 5 + .../tcl/tcl8.6/tzdata/NZ-CHAT | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Navajo | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/PRC | 5 + .../tcl/tcl8.6/tzdata/PST8PDT | 278 + .../tcl/tcl8.6/tzdata/Pacific/Apia | 188 + .../tcl/tcl8.6/tzdata/Pacific/Auckland | 285 + .../tcl/tcl8.6/tzdata/Pacific/Bougainville | 10 + .../tcl/tcl8.6/tzdata/Pacific/Chatham | 258 + .../tcl/tcl8.6/tzdata/Pacific/Chuuk | 6 + .../tcl/tcl8.6/tzdata/Pacific/Easter | 268 + .../tcl/tcl8.6/tzdata/Pacific/Efate | 26 + .../tcl/tcl8.6/tzdata/Pacific/Enderbury | 8 + .../tcl/tcl8.6/tzdata/Pacific/Fakaofo | 7 + .../tcl/tcl8.6/tzdata/Pacific/Fiji | 191 + .../tcl/tcl8.6/tzdata/Pacific/Funafuti | 6 + .../tcl/tcl8.6/tzdata/Pacific/Galapagos | 7 + .../tcl/tcl8.6/tzdata/Pacific/Gambier | 6 + .../tcl/tcl8.6/tzdata/Pacific/Guadalcanal | 6 + .../tcl/tcl8.6/tzdata/Pacific/Guam | 8 + .../tcl/tcl8.6/tzdata/Pacific/Honolulu | 11 + .../tcl/tcl8.6/tzdata/Pacific/Johnston | 5 + .../tcl/tcl8.6/tzdata/Pacific/Kiritimati | 8 + .../tcl/tcl8.6/tzdata/Pacific/Kosrae | 8 + .../tcl/tcl8.6/tzdata/Pacific/Kwajalein | 8 + .../tcl/tcl8.6/tzdata/Pacific/Majuro | 7 + .../tcl/tcl8.6/tzdata/Pacific/Marquesas | 6 + .../tcl/tcl8.6/tzdata/Pacific/Midway | 5 + .../tcl/tcl8.6/tzdata/Pacific/Nauru | 9 + .../tcl/tcl8.6/tzdata/Pacific/Niue | 8 + .../tcl/tcl8.6/tzdata/Pacific/Norfolk | 10 + .../tcl/tcl8.6/tzdata/Pacific/Noumea | 12 + .../tcl/tcl8.6/tzdata/Pacific/Pago_Pago | 9 + .../tcl/tcl8.6/tzdata/Pacific/Palau | 6 + .../tcl/tcl8.6/tzdata/Pacific/Pitcairn | 7 + .../tcl/tcl8.6/tzdata/Pacific/Pohnpei | 6 + .../tcl/tcl8.6/tzdata/Pacific/Ponape | 5 + .../tcl/tcl8.6/tzdata/Pacific/Port_Moresby | 7 + .../tcl/tcl8.6/tzdata/Pacific/Rarotonga | 32 + .../tcl/tcl8.6/tzdata/Pacific/Saipan | 5 + .../tcl/tcl8.6/tzdata/Pacific/Samoa | 5 + .../tcl/tcl8.6/tzdata/Pacific/Tahiti | 6 + .../tcl/tcl8.6/tzdata/Pacific/Tarawa | 6 + .../tcl/tcl8.6/tzdata/Pacific/Tongatapu | 14 + .../tcl/tcl8.6/tzdata/Pacific/Truk | 5 + .../tcl/tcl8.6/tzdata/Pacific/Wake | 6 + .../tcl/tcl8.6/tzdata/Pacific/Wallis | 6 + .../tcl/tcl8.6/tzdata/Pacific/Yap | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Poland | 5 + .../tcl/tcl8.6/tzdata/Portugal | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/ROC | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/ROK | 5 + .../tcl/tcl8.6/tzdata/Singapore | 5 + .../tcl/tcl8.6/tzdata/SystemV/AST4 | 5 + .../tcl/tcl8.6/tzdata/SystemV/AST4ADT | 5 + .../tcl/tcl8.6/tzdata/SystemV/CST6 | 5 + .../tcl/tcl8.6/tzdata/SystemV/CST6CDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/EST5 | 5 + .../tcl/tcl8.6/tzdata/SystemV/EST5EDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/HST10 | 5 + .../tcl/tcl8.6/tzdata/SystemV/MST7 | 5 + .../tcl/tcl8.6/tzdata/SystemV/MST7MDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/PST8 | 5 + .../tcl/tcl8.6/tzdata/SystemV/PST8PDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/YST9 | 5 + .../tcl/tcl8.6/tzdata/SystemV/YST9YDT | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Turkey | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/UCT | 5 + .../tcl/tcl8.6/tzdata/US/Alaska | 5 + .../tcl/tcl8.6/tzdata/US/Aleutian | 5 + .../tcl/tcl8.6/tzdata/US/Arizona | 5 + .../tcl/tcl8.6/tzdata/US/Central | 5 + .../tcl/tcl8.6/tzdata/US/East-Indiana | 5 + .../tcl/tcl8.6/tzdata/US/Eastern | 5 + .../tcl/tcl8.6/tzdata/US/Hawaii | 5 + .../tcl/tcl8.6/tzdata/US/Indiana-Starke | 5 + .../tcl/tcl8.6/tzdata/US/Michigan | 5 + .../tcl/tcl8.6/tzdata/US/Mountain | 5 + .../tcl/tcl8.6/tzdata/US/Pacific | 5 + .../tcl/tcl8.6/tzdata/US/Pacific-New | 5 + .../tcl/tcl8.6/tzdata/US/Samoa | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/UTC | 5 + .../tcl/tcl8.6/tzdata/Universal | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/W-SU | 5 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/WET | 251 + .../FlaskWebProject1/tcl/tcl8.6/tzdata/Zulu | 5 + .../FlaskWebProject1/tcl/tcl8.6/word.tcl | 152 + .../FlaskWebProject1/tcl/tk8.6/bgerror.tcl | 265 + .../FlaskWebProject1/tcl/tk8.6/button.tcl | 778 ++ .../FlaskWebProject1/tcl/tk8.6/choosedir.tcl | 308 + .../FlaskWebProject1/tcl/tk8.6/clrpick.tcl | 695 ++ .../FlaskWebProject1/tcl/tk8.6/comdlg.tcl | 319 + .../FlaskWebProject1/tcl/tk8.6/console.tcl | 1148 ++ .../FlaskWebProject1/tcl/tk8.6/demos/README | 44 + .../tcl/tk8.6/demos/anilabel.tcl | 160 + .../tcl/tk8.6/demos/aniwave.tcl | 104 + .../tcl/tk8.6/demos/arrow.tcl | 237 + .../FlaskWebProject1/tcl/tk8.6/demos/bind.tcl | 78 + .../tcl/tk8.6/demos/bitmap.tcl | 52 + .../FlaskWebProject1/tcl/tk8.6/demos/browse | 66 + .../tcl/tk8.6/demos/button.tcl | 47 + .../tcl/tk8.6/demos/check.tcl | 71 + .../tcl/tk8.6/demos/clrpick.tcl | 54 + .../tcl/tk8.6/demos/colors.tcl | 99 + .../tcl/tk8.6/demos/combo.tcl | 61 + .../tcl/tk8.6/demos/cscroll.tcl | 108 + .../tcl/tk8.6/demos/ctext.tcl | 172 + .../tcl/tk8.6/demos/dialog1.tcl | 13 + .../tcl/tk8.6/demos/dialog2.tcl | 17 + .../FlaskWebProject1/tcl/tk8.6/demos/en.msg | 97 + .../tcl/tk8.6/demos/entry1.tcl | 34 + .../tcl/tk8.6/demos/entry2.tcl | 46 + .../tcl/tk8.6/demos/entry3.tcl | 185 + .../tcl/tk8.6/demos/filebox.tcl | 81 + .../tcl/tk8.6/demos/fontchoose.tcl | 69 + .../FlaskWebProject1/tcl/tk8.6/demos/form.tcl | 38 + .../FlaskWebProject1/tcl/tk8.6/demos/hello | 22 + .../tcl/tk8.6/demos/hscale.tcl | 45 + .../FlaskWebProject1/tcl/tk8.6/demos/icon.tcl | 51 + .../tcl/tk8.6/demos/image1.tcl | 35 + .../tcl/tk8.6/demos/image2.tcl | 108 + .../tcl/tk8.6/demos/images/earthris.gif | Bin 0 -> 6343 bytes .../tcl/tk8.6/demos/images/flagdown.xbm | 27 + .../tcl/tk8.6/demos/images/flagup.xbm | 27 + .../tcl/tk8.6/demos/images/gray25.xbm | 6 + .../tcl/tk8.6/demos/images/letters.xbm | 27 + .../tcl/tk8.6/demos/images/noletter.xbm | 27 + .../tcl/tk8.6/demos/images/pattern.xbm | 6 + .../tcl/tk8.6/demos/images/tcllogo.gif | Bin 0 -> 2341 bytes .../tcl/tk8.6/demos/items.tcl | 291 + .../FlaskWebProject1/tcl/tk8.6/demos/ixset | 328 + .../tcl/tk8.6/demos/knightstour.tcl | 268 + .../tcl/tk8.6/demos/label.tcl | 40 + .../tcl/tk8.6/demos/labelframe.tcl | 76 + .../tcl/tk8.6/demos/license.terms | 40 + .../tcl/tk8.6/demos/mclist.tcl | 119 + .../FlaskWebProject1/tcl/tk8.6/demos/menu.tcl | 161 + .../tcl/tk8.6/demos/menubu.tcl | 90 + .../tcl/tk8.6/demos/msgbox.tcl | 62 + .../FlaskWebProject1/tcl/tk8.6/demos/nl.msg | 125 + .../tcl/tk8.6/demos/paned1.tcl | 32 + .../tcl/tk8.6/demos/paned2.tcl | 74 + .../tcl/tk8.6/demos/pendulum.tcl | 197 + .../FlaskWebProject1/tcl/tk8.6/demos/plot.tcl | 97 + .../tcl/tk8.6/demos/puzzle.tcl | 82 + .../tcl/tk8.6/demos/radio.tcl | 66 + .../FlaskWebProject1/tcl/tk8.6/demos/rmt | 210 + .../FlaskWebProject1/tcl/tk8.6/demos/rolodex | 204 + .../tcl/tk8.6/demos/ruler.tcl | 171 + .../tcl/tk8.6/demos/sayings.tcl | 44 + .../tcl/tk8.6/demos/search.tcl | 139 + .../FlaskWebProject1/tcl/tk8.6/demos/spin.tcl | 53 + .../FlaskWebProject1/tcl/tk8.6/demos/square | 60 + .../tcl/tk8.6/demos/states.tcl | 54 + .../tcl/tk8.6/demos/style.tcl | 155 + .../FlaskWebProject1/tcl/tk8.6/demos/tclIndex | 67 + .../FlaskWebProject1/tcl/tk8.6/demos/tcolor | 358 + .../FlaskWebProject1/tcl/tk8.6/demos/text.tcl | 111 + .../tcl/tk8.6/demos/textpeer.tcl | 62 + .../FlaskWebProject1/tcl/tk8.6/demos/timer | 47 + .../tcl/tk8.6/demos/toolbar.tcl | 92 + .../FlaskWebProject1/tcl/tk8.6/demos/tree.tcl | 88 + .../tcl/tk8.6/demos/ttkbut.tcl | 84 + .../tcl/tk8.6/demos/ttkmenu.tcl | 53 + .../tcl/tk8.6/demos/ttknote.tcl | 57 + .../tcl/tk8.6/demos/ttkpane.tcl | 112 + .../tcl/tk8.6/demos/ttkprogress.tcl | 46 + .../tcl/tk8.6/demos/ttkscale.tcl | 39 + .../tcl/tk8.6/demos/twind.tcl | 325 + .../tcl/tk8.6/demos/unicodeout.tcl | 137 + .../tcl/tk8.6/demos/vscale.tcl | 46 + .../FlaskWebProject1/tcl/tk8.6/demos/widget | 721 ++ .../FlaskWebProject1/tcl/tk8.6/dialog.tcl | 180 + .../FlaskWebProject1/tcl/tk8.6/entry.tcl | 654 ++ .../FlaskWebProject1/tcl/tk8.6/focus.tcl | 178 + .../tcl/tk8.6/fontchooser.tcl | 449 + .../FlaskWebProject1/tcl/tk8.6/iconlist.tcl | 696 ++ .../FlaskWebProject1/tcl/tk8.6/icons.tcl | 153 + .../FlaskWebProject1/tcl/tk8.6/images/README | 7 + .../tcl/tk8.6/images/logo.eps | 2091 ++++ .../tcl/tk8.6/images/logo100.gif | Bin 0 -> 2341 bytes .../tcl/tk8.6/images/logo64.gif | Bin 0 -> 1670 bytes .../tcl/tk8.6/images/logoLarge.gif | Bin 0 -> 11000 bytes .../tcl/tk8.6/images/logoMed.gif | Bin 0 -> 3889 bytes .../tcl/tk8.6/images/pwrdLogo.eps | 1897 ++++ .../tcl/tk8.6/images/pwrdLogo100.gif | Bin 0 -> 1615 bytes .../tcl/tk8.6/images/pwrdLogo150.gif | Bin 0 -> 2489 bytes .../tcl/tk8.6/images/pwrdLogo175.gif | Bin 0 -> 2981 bytes .../tcl/tk8.6/images/pwrdLogo200.gif | Bin 0 -> 3491 bytes .../tcl/tk8.6/images/pwrdLogo75.gif | Bin 0 -> 1171 bytes .../tcl/tk8.6/images/tai-ku.gif | Bin 0 -> 5473 bytes .../FlaskWebProject1/tcl/tk8.6/license.terms | 40 + .../FlaskWebProject1/tcl/tk8.6/listbox.tcl | 552 + .../FlaskWebProject1/tcl/tk8.6/megawidget.tcl | 297 + .../FlaskWebProject1/tcl/tk8.6/menu.tcl | 1349 +++ .../FlaskWebProject1/tcl/tk8.6/mkpsenc.tcl | 1488 +++ .../FlaskWebProject1/tcl/tk8.6/msgbox.tcl | 429 + .../FlaskWebProject1/tcl/tk8.6/msgs/cs.msg | 77 + .../FlaskWebProject1/tcl/tk8.6/msgs/da.msg | 78 + .../FlaskWebProject1/tcl/tk8.6/msgs/de.msg | 91 + .../FlaskWebProject1/tcl/tk8.6/msgs/el.msg | 86 + .../FlaskWebProject1/tcl/tk8.6/msgs/en.msg | 91 + .../FlaskWebProject1/tcl/tk8.6/msgs/en_gb.msg | 3 + .../FlaskWebProject1/tcl/tk8.6/msgs/eo.msg | 75 + .../FlaskWebProject1/tcl/tk8.6/msgs/es.msg | 76 + .../FlaskWebProject1/tcl/tk8.6/msgs/fr.msg | 72 + .../FlaskWebProject1/tcl/tk8.6/msgs/hu.msg | 78 + .../FlaskWebProject1/tcl/tk8.6/msgs/it.msg | 73 + .../FlaskWebProject1/tcl/tk8.6/msgs/nl.msg | 91 + .../FlaskWebProject1/tcl/tk8.6/msgs/pl.msg | 91 + .../FlaskWebProject1/tcl/tk8.6/msgs/pt.msg | 74 + .../FlaskWebProject1/tcl/tk8.6/msgs/ru.msg | 75 + .../FlaskWebProject1/tcl/tk8.6/msgs/sv.msg | 76 + .../FlaskWebProject1/tcl/tk8.6/obsolete.tcl | 178 + .../FlaskWebProject1/tcl/tk8.6/optMenu.tcl | 43 + .../FlaskWebProject1/tcl/tk8.6/palette.tcl | 244 + .../tcl/tk8.6/panedwindow.tcl | 194 + .../FlaskWebProject1/tcl/tk8.6/pkgIndex.tcl | 7 + .../FlaskWebProject1/tcl/tk8.6/safetk.tcl | 262 + .../FlaskWebProject1/tcl/tk8.6/scale.tcl | 290 + .../FlaskWebProject1/tcl/tk8.6/scrlbar.tcl | 454 + .../FlaskWebProject1/tcl/tk8.6/spinbox.tcl | 580 + .../FlaskWebProject1/tcl/tk8.6/tclIndex | 253 + .../FlaskWebProject1/tcl/tk8.6/tearoff.tcl | 180 + .../FlaskWebProject1/tcl/tk8.6/text.tcl | 1204 ++ .../FlaskWebProject1/tcl/tk8.6/tk.tcl | 694 ++ .../FlaskWebProject1/tcl/tk8.6/tkfbox.tcl | 1237 +++ .../tcl/tk8.6/ttk/altTheme.tcl | 101 + .../tcl/tk8.6/ttk/aquaTheme.tcl | 59 + .../FlaskWebProject1/tcl/tk8.6/ttk/button.tcl | 83 + .../tcl/tk8.6/ttk/clamTheme.tcl | 137 + .../tcl/tk8.6/ttk/classicTheme.tcl | 108 + .../tcl/tk8.6/ttk/combobox.tcl | 456 + .../tcl/tk8.6/ttk/cursors.tcl | 186 + .../tcl/tk8.6/ttk/defaults.tcl | 125 + .../FlaskWebProject1/tcl/tk8.6/ttk/entry.tcl | 607 + .../FlaskWebProject1/tcl/tk8.6/ttk/fonts.tcl | 157 + .../tcl/tk8.6/ttk/menubutton.tcl | 169 + .../tcl/tk8.6/ttk/notebook.tcl | 197 + .../tcl/tk8.6/ttk/panedwindow.tcl | 82 + .../tcl/tk8.6/ttk/progress.tcl | 49 + .../FlaskWebProject1/tcl/tk8.6/ttk/scale.tcl | 94 + .../tcl/tk8.6/ttk/scrollbar.tcl | 123 + .../tcl/tk8.6/ttk/sizegrip.tcl | 102 + .../tcl/tk8.6/ttk/spinbox.tcl | 173 + .../tcl/tk8.6/ttk/treeview.tcl | 363 + .../FlaskWebProject1/tcl/tk8.6/ttk/ttk.tcl | 176 + .../FlaskWebProject1/tcl/tk8.6/ttk/utils.tcl | 350 + .../tcl/tk8.6/ttk/vistaTheme.tcl | 224 + .../tcl/tk8.6/ttk/winTheme.tcl | 80 + .../tcl/tk8.6/ttk/xpTheme.tcl | 65 + .../tcl/tk8.6/unsupported.tcl | 269 + .../FlaskWebProject1/tcl/tk8.6/xmfbox.tcl | 988 ++ .../FlaskWebProject1/templates/about.html | 10 + .../FlaskWebProject1/templates/contact.html | 20 + .../FlaskWebProject1/templates/index.html | 33 + .../FlaskWebProject1/templates/layout.html | 49 + .../FlaskWebProject1/templates/resume.html | 10 + .../FlaskWebProject1/templates/tvmedia.html | 10 + flaskwebproject/FlaskWebProject1/views.py | 64 + flaskwebproject/FlaskWebenv/Lib/__future__.py | 140 + .../FlaskWebenv/Lib/_bootlocale.py | 34 + .../FlaskWebenv/Lib/_collections_abc.py | 1011 ++ .../FlaskWebenv/Lib/_dummy_thread.py | 163 + .../FlaskWebenv/Lib/_weakrefset.py | 196 + flaskwebproject/FlaskWebenv/Lib/abc.py | 250 + flaskwebproject/FlaskWebenv/Lib/base64.py | 602 + flaskwebproject/FlaskWebenv/Lib/bisect.py | 92 + flaskwebproject/FlaskWebenv/Lib/codecs.py | 1113 ++ .../FlaskWebenv/Lib/collections/__init__.py | 1244 +++ .../FlaskWebenv/Lib/collections/abc.py | 2 + flaskwebproject/FlaskWebenv/Lib/copy.py | 313 + flaskwebproject/FlaskWebenv/Lib/copyreg.py | 206 + .../FlaskWebenv/Lib/distutils/__init__.py | 116 + .../FlaskWebenv/Lib/distutils/distutils.cfg | 6 + .../FlaskWebenv/Lib/encodings/__init__.py | 169 + .../FlaskWebenv/Lib/encodings/aliases.py | 550 + .../FlaskWebenv/Lib/encodings/ascii.py | 50 + .../FlaskWebenv/Lib/encodings/base64_codec.py | 55 + .../FlaskWebenv/Lib/encodings/big5.py | 39 + .../FlaskWebenv/Lib/encodings/big5hkscs.py | 39 + .../FlaskWebenv/Lib/encodings/bz2_codec.py | 78 + .../FlaskWebenv/Lib/encodings/charmap.py | 69 + .../FlaskWebenv/Lib/encodings/cp037.py | 307 + .../FlaskWebenv/Lib/encodings/cp1006.py | 307 + .../FlaskWebenv/Lib/encodings/cp1026.py | 307 + .../FlaskWebenv/Lib/encodings/cp1125.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp1140.py | 307 + .../FlaskWebenv/Lib/encodings/cp1250.py | 307 + .../FlaskWebenv/Lib/encodings/cp1251.py | 307 + .../FlaskWebenv/Lib/encodings/cp1252.py | 307 + .../FlaskWebenv/Lib/encodings/cp1253.py | 307 + .../FlaskWebenv/Lib/encodings/cp1254.py | 307 + .../FlaskWebenv/Lib/encodings/cp1255.py | 307 + .../FlaskWebenv/Lib/encodings/cp1256.py | 307 + .../FlaskWebenv/Lib/encodings/cp1257.py | 307 + .../FlaskWebenv/Lib/encodings/cp1258.py | 307 + .../FlaskWebenv/Lib/encodings/cp273.py | 307 + .../FlaskWebenv/Lib/encodings/cp424.py | 307 + .../FlaskWebenv/Lib/encodings/cp437.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp500.py | 307 + .../FlaskWebenv/Lib/encodings/cp65001.py | 43 + .../FlaskWebenv/Lib/encodings/cp720.py | 309 + .../FlaskWebenv/Lib/encodings/cp737.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp775.py | 697 ++ .../FlaskWebenv/Lib/encodings/cp850.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp852.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp855.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp856.py | 307 + .../FlaskWebenv/Lib/encodings/cp857.py | 694 ++ .../FlaskWebenv/Lib/encodings/cp858.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp860.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp861.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp862.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp863.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp864.py | 690 ++ .../FlaskWebenv/Lib/encodings/cp865.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp866.py | 698 ++ .../FlaskWebenv/Lib/encodings/cp869.py | 689 ++ .../FlaskWebenv/Lib/encodings/cp874.py | 307 + .../FlaskWebenv/Lib/encodings/cp875.py | 307 + .../FlaskWebenv/Lib/encodings/cp932.py | 39 + .../FlaskWebenv/Lib/encodings/cp949.py | 39 + .../FlaskWebenv/Lib/encodings/cp950.py | 39 + .../FlaskWebenv/Lib/encodings/euc_jis_2004.py | 39 + .../FlaskWebenv/Lib/encodings/euc_jisx0213.py | 39 + .../FlaskWebenv/Lib/encodings/euc_jp.py | 39 + .../FlaskWebenv/Lib/encodings/euc_kr.py | 39 + .../FlaskWebenv/Lib/encodings/gb18030.py | 39 + .../FlaskWebenv/Lib/encodings/gb2312.py | 39 + .../FlaskWebenv/Lib/encodings/gbk.py | 39 + .../FlaskWebenv/Lib/encodings/hex_codec.py | 55 + .../FlaskWebenv/Lib/encodings/hp_roman8.py | 314 + .../FlaskWebenv/Lib/encodings/hz.py | 39 + .../FlaskWebenv/Lib/encodings/idna.py | 309 + .../FlaskWebenv/Lib/encodings/iso2022_jp.py | 39 + .../FlaskWebenv/Lib/encodings/iso2022_jp_1.py | 39 + .../FlaskWebenv/Lib/encodings/iso2022_jp_2.py | 39 + .../Lib/encodings/iso2022_jp_2004.py | 39 + .../FlaskWebenv/Lib/encodings/iso2022_jp_3.py | 39 + .../Lib/encodings/iso2022_jp_ext.py | 39 + .../FlaskWebenv/Lib/encodings/iso2022_kr.py | 39 + .../FlaskWebenv/Lib/encodings/iso8859_1.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_10.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_11.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_13.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_14.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_15.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_16.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_2.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_3.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_4.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_5.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_6.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_7.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_8.py | 307 + .../FlaskWebenv/Lib/encodings/iso8859_9.py | 307 + .../FlaskWebenv/Lib/encodings/johab.py | 39 + .../FlaskWebenv/Lib/encodings/koi8_r.py | 307 + .../FlaskWebenv/Lib/encodings/koi8_t.py | 308 + .../FlaskWebenv/Lib/encodings/koi8_u.py | 307 + .../FlaskWebenv/Lib/encodings/kz1048.py | 307 + .../FlaskWebenv/Lib/encodings/latin_1.py | 50 + .../FlaskWebenv/Lib/encodings/mac_arabic.py | 698 ++ .../FlaskWebenv/Lib/encodings/mac_centeuro.py | 307 + .../FlaskWebenv/Lib/encodings/mac_croatian.py | 307 + .../FlaskWebenv/Lib/encodings/mac_cyrillic.py | 307 + .../FlaskWebenv/Lib/encodings/mac_farsi.py | 307 + .../FlaskWebenv/Lib/encodings/mac_greek.py | 307 + .../FlaskWebenv/Lib/encodings/mac_iceland.py | 307 + .../FlaskWebenv/Lib/encodings/mac_latin2.py | 312 + .../FlaskWebenv/Lib/encodings/mac_roman.py | 307 + .../FlaskWebenv/Lib/encodings/mac_romanian.py | 307 + .../FlaskWebenv/Lib/encodings/mac_turkish.py | 307 + .../FlaskWebenv/Lib/encodings/mbcs.py | 47 + .../FlaskWebenv/Lib/encodings/oem.py | 41 + .../FlaskWebenv/Lib/encodings/palmos.py | 308 + .../FlaskWebenv/Lib/encodings/ptcp154.py | 312 + .../FlaskWebenv/Lib/encodings/punycode.py | 237 + .../FlaskWebenv/Lib/encodings/quopri_codec.py | 56 + .../Lib/encodings/raw_unicode_escape.py | 45 + .../FlaskWebenv/Lib/encodings/rot_13.py | 113 + .../FlaskWebenv/Lib/encodings/shift_jis.py | 39 + .../Lib/encodings/shift_jis_2004.py | 39 + .../Lib/encodings/shift_jisx0213.py | 39 + .../FlaskWebenv/Lib/encodings/tis_620.py | 307 + .../FlaskWebenv/Lib/encodings/undefined.py | 49 + .../Lib/encodings/unicode_escape.py | 45 + .../Lib/encodings/unicode_internal.py | 45 + .../FlaskWebenv/Lib/encodings/utf_16.py | 155 + .../FlaskWebenv/Lib/encodings/utf_16_be.py | 42 + .../FlaskWebenv/Lib/encodings/utf_16_le.py | 42 + .../FlaskWebenv/Lib/encodings/utf_32.py | 150 + .../FlaskWebenv/Lib/encodings/utf_32_be.py | 37 + .../FlaskWebenv/Lib/encodings/utf_32_le.py | 37 + .../FlaskWebenv/Lib/encodings/utf_7.py | 38 + .../FlaskWebenv/Lib/encodings/utf_8.py | 42 + .../FlaskWebenv/Lib/encodings/utf_8_sig.py | 130 + .../FlaskWebenv/Lib/encodings/uu_codec.py | 99 + .../FlaskWebenv/Lib/encodings/zlib_codec.py | 77 + flaskwebproject/FlaskWebenv/Lib/enum.py | 875 ++ flaskwebproject/FlaskWebenv/Lib/fnmatch.py | 109 + flaskwebproject/FlaskWebenv/Lib/functools.py | 811 ++ .../FlaskWebenv/Lib/genericpath.py | 151 + flaskwebproject/FlaskWebenv/Lib/hashlib.py | 251 + flaskwebproject/FlaskWebenv/Lib/heapq.py | 607 + flaskwebproject/FlaskWebenv/Lib/hmac.py | 144 + flaskwebproject/FlaskWebenv/Lib/imp.py | 346 + .../FlaskWebenv/Lib/importlib/__init__.py | 173 + .../FlaskWebenv/Lib/importlib/_bootstrap.py | 1161 ++ .../FlaskWebenv/Lib/importlib/abc.py | 329 + .../FlaskWebenv/Lib/importlib/machinery.py | 21 + .../FlaskWebenv/Lib/importlib/util.py | 288 + flaskwebproject/FlaskWebenv/Lib/io.py | 99 + flaskwebproject/FlaskWebenv/Lib/keyword.py | 94 + flaskwebproject/FlaskWebenv/Lib/linecache.py | 177 + flaskwebproject/FlaskWebenv/Lib/locale.py | 1731 +++ .../Lib/no-global-site-packages.txt | 0 flaskwebproject/FlaskWebenv/Lib/ntpath.py | 693 ++ flaskwebproject/FlaskWebenv/Lib/operator.py | 464 + .../FlaskWebenv/Lib/orig-prefix.txt | 1 + flaskwebproject/FlaskWebenv/Lib/os.py | 1069 ++ flaskwebproject/FlaskWebenv/Lib/posixpath.py | 522 + flaskwebproject/FlaskWebenv/Lib/random.py | 770 ++ flaskwebproject/FlaskWebenv/Lib/re.py | 381 + flaskwebproject/FlaskWebenv/Lib/reprlib.py | 164 + .../FlaskWebenv/Lib/rlcompleter.py | 205 + flaskwebproject/FlaskWebenv/Lib/shutil.py | 1153 ++ .../Click-7.0.dist-info/INSTALLER | 1 + .../Click-7.0.dist-info/LICENSE.txt | 39 + .../Click-7.0.dist-info/METADATA | 121 + .../site-packages/Click-7.0.dist-info/RECORD | 40 + .../site-packages/Click-7.0.dist-info/WHEEL | 6 + .../Click-7.0.dist-info/top_level.txt | 1 + .../Flask-0.12.4.dist-info/INSTALLER | 1 + .../Flask-0.12.4.dist-info/LICENSE.txt | 33 + .../Flask-0.12.4.dist-info/METADATA | 76 + .../Flask-0.12.4.dist-info/RECORD | 50 + .../Flask-0.12.4.dist-info/WHEEL | 6 + .../Flask-0.12.4.dist-info/entry_points.txt | 4 + .../Flask-0.12.4.dist-info/top_level.txt | 1 + .../Flask_Migrate-2.3.1.dist-info/INSTALLER | 1 + .../Flask_Migrate-2.3.1.dist-info/METADATA | 28 + .../Flask_Migrate-2.3.1.dist-info/RECORD | 20 + .../Flask_Migrate-2.3.1.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../top_level.txt | 1 + .../DESCRIPTION.rst | 15 + .../INSTALLER | 1 + .../LICENSE.txt | 31 + .../Flask_SQLAlchemy-2.3.2.dist-info/METADATA | 43 + .../Flask_SQLAlchemy-2.3.2.dist-info/RECORD | 14 + .../Flask_SQLAlchemy-2.3.2.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../Jinja2-2.10.dist-info/DESCRIPTION.rst | 37 + .../Jinja2-2.10.dist-info/INSTALLER | 1 + .../Jinja2-2.10.dist-info/LICENSE.txt | 31 + .../Jinja2-2.10.dist-info/METADATA | 68 + .../Jinja2-2.10.dist-info/RECORD | 63 + .../site-packages/Jinja2-2.10.dist-info/WHEEL | 6 + .../Jinja2-2.10.dist-info/entry_points.txt | 4 + .../Jinja2-2.10.dist-info/top_level.txt | 1 + .../Mako-1.0.7.dist-info/AUTHORS | 13 + .../Mako-1.0.7.dist-info/INSTALLER | 1 + .../Mako-1.0.7.dist-info/LICENSE | 20 + .../Mako-1.0.7.dist-info/METADATA | 74 + .../site-packages/Mako-1.0.7.dist-info/RECORD | 61 + .../site-packages/Mako-1.0.7.dist-info/WHEEL | 5 + .../Mako-1.0.7.dist-info/entry_points.txt | 20 + .../Mako-1.0.7.dist-info/top_level.txt | 1 + .../MarkupSafe-1.1.0.dist-info/INSTALLER | 1 + .../MarkupSafe-1.1.0.dist-info/LICENSE.rst | 33 + .../MarkupSafe-1.1.0.dist-info/METADATA | 103 + .../MarkupSafe-1.1.0.dist-info/RECORD | 15 + .../MarkupSafe-1.1.0.dist-info/WHEEL | 5 + .../MarkupSafe-1.1.0.dist-info/top_level.txt | 1 + .../SQLAlchemy-1.2.14.dist-info/INSTALLER | 1 + .../SQLAlchemy-1.2.14.dist-info/LICENSE | 20 + .../SQLAlchemy-1.2.14.dist-info/METADATA | 182 + .../SQLAlchemy-1.2.14.dist-info/RECORD | 391 + .../SQLAlchemy-1.2.14.dist-info/WHEEL | 5 + .../SQLAlchemy-1.2.14.dist-info/top_level.txt | 1 + .../Werkzeug-0.14.1.dist-info/DESCRIPTION.rst | 80 + .../Werkzeug-0.14.1.dist-info/INSTALLER | 1 + .../Werkzeug-0.14.1.dist-info/LICENSE.txt | 31 + .../Werkzeug-0.14.1.dist-info/METADATA | 116 + .../Werkzeug-0.14.1.dist-info/RECORD | 97 + .../Werkzeug-0.14.1.dist-info/WHEEL | 6 + .../Werkzeug-0.14.1.dist-info/top_level.txt | 1 + .../alembic-1.0.5.dist-info/INSTALLER | 1 + .../alembic-1.0.5.dist-info/LICENSE | 20 + .../alembic-1.0.5.dist-info/METADATA | 109 + .../alembic-1.0.5.dist-info/RECORD | 135 + .../alembic-1.0.5.dist-info/WHEEL | 6 + .../alembic-1.0.5.dist-info/entry_points.txt | 3 + .../alembic-1.0.5.dist-info/top_level.txt | 1 + .../Lib/site-packages/alembic/__init__.py | 15 + .../alembic/autogenerate/__init__.py | 8 + .../site-packages/alembic/autogenerate/api.py | 480 + .../alembic/autogenerate/compare.py | 893 ++ .../alembic/autogenerate/render.py | 794 ++ .../alembic/autogenerate/rewriter.py | 150 + .../Lib/site-packages/alembic/command.py | 542 + .../Lib/site-packages/alembic/config.py | 506 + .../Lib/site-packages/alembic/context.py | 5 + .../Lib/site-packages/alembic/ddl/__init__.py | 2 + .../Lib/site-packages/alembic/ddl/base.py | 204 + .../Lib/site-packages/alembic/ddl/impl.py | 358 + .../Lib/site-packages/alembic/ddl/mssql.py | 246 + .../Lib/site-packages/alembic/ddl/mysql.py | 352 + .../Lib/site-packages/alembic/ddl/oracle.py | 86 + .../site-packages/alembic/ddl/postgresql.py | 463 + .../Lib/site-packages/alembic/ddl/sqlite.py | 100 + .../Lib/site-packages/alembic/op.py | 6 + .../alembic/operations/__init__.py | 6 + .../site-packages/alembic/operations/base.py | 445 + .../site-packages/alembic/operations/batch.py | 378 + .../site-packages/alembic/operations/ops.py | 2062 ++++ .../alembic/operations/schemaobj.py | 157 + .../alembic/operations/toimpl.py | 162 + .../site-packages/alembic/runtime/__init__.py | 0 .../alembic/runtime/environment.py | 936 ++ .../alembic/runtime/migration.py | 989 ++ .../site-packages/alembic/script/__init__.py | 3 + .../Lib/site-packages/alembic/script/base.py | 829 ++ .../site-packages/alembic/script/revision.py | 942 ++ .../alembic/templates/generic/README | 1 + .../templates/generic/alembic.ini.mako | 74 + .../alembic/templates/generic/env.py | 70 + .../alembic/templates/generic/script.py.mako | 24 + .../alembic/templates/multidb/README | 1 + .../templates/multidb/alembic.ini.mako | 80 + .../alembic/templates/multidb/env.py | 133 + .../alembic/templates/multidb/script.py.mako | 45 + .../alembic/templates/pylons/README | 1 + .../alembic/templates/pylons/alembic.ini.mako | 40 + .../alembic/templates/pylons/env.py | 78 + .../alembic/templates/pylons/script.py.mako | 24 + .../site-packages/alembic/testing/__init__.py | 10 + .../alembic/testing/assertions.py | 208 + .../site-packages/alembic/testing/compat.py | 13 + .../site-packages/alembic/testing/config.py | 91 + .../site-packages/alembic/testing/engines.py | 28 + .../Lib/site-packages/alembic/testing/env.py | 436 + .../alembic/testing/exclusions.py | 447 + .../site-packages/alembic/testing/fixtures.py | 171 + .../Lib/site-packages/alembic/testing/mock.py | 25 + .../alembic/testing/plugin/__init__.py | 3 + .../alembic/testing/plugin/bootstrap.py | 44 + .../alembic/testing/plugin/noseplugin.py | 103 + .../alembic/testing/plugin/plugin_base.py | 553 + .../alembic/testing/plugin/pytestplugin.py | 210 + .../alembic/testing/provision.py | 341 + .../alembic/testing/requirements.py | 144 + .../site-packages/alembic/testing/runner.py | 48 + .../Lib/site-packages/alembic/testing/util.py | 19 + .../site-packages/alembic/testing/warnings.py | 43 + .../site-packages/alembic/util/__init__.py | 17 + .../Lib/site-packages/alembic/util/compat.py | 309 + .../Lib/site-packages/alembic/util/exc.py | 2 + .../site-packages/alembic/util/langhelpers.py | 332 + .../site-packages/alembic/util/messaging.py | 95 + .../Lib/site-packages/alembic/util/pyfiles.py | 90 + .../site-packages/alembic/util/sqla_compat.py | 208 + .../Lib/site-packages/click/__init__.py | 97 + .../Lib/site-packages/click/_bashcomplete.py | 293 + .../Lib/site-packages/click/_compat.py | 703 ++ .../Lib/site-packages/click/_termui_impl.py | 621 ++ .../Lib/site-packages/click/_textwrap.py | 38 + .../Lib/site-packages/click/_unicodefun.py | 125 + .../Lib/site-packages/click/_winconsole.py | 307 + .../Lib/site-packages/click/decorators.py | 311 + .../Lib/site-packages/click/exceptions.py | 235 + .../Lib/site-packages/click/formatting.py | 256 + .../Lib/site-packages/click/globals.py | 48 + .../Lib/site-packages/click/parser.py | 427 + .../Lib/site-packages/click/termui.py | 606 + .../Lib/site-packages/click/testing.py | 374 + .../Lib/site-packages/click/types.py | 668 ++ .../Lib/site-packages/click/utils.py | 440 + .../config-0.4.0.dist-info/INSTALLER | 1 + .../config-0.4.0.dist-info/LICENSE | 11 + .../config-0.4.0.dist-info/METADATA | 29 + .../config-0.4.0.dist-info/RECORD | 8 + .../config-0.4.0.dist-info/WHEEL | 5 + .../config-0.4.0.dist-info/top_level.txt | 1 + .../FlaskWebenv/Lib/site-packages/config.py | 1674 +++ .../Lib/site-packages/dateutil/__init__.py | 8 + .../Lib/site-packages/dateutil/_common.py | 43 + .../Lib/site-packages/dateutil/_version.py | 4 + .../Lib/site-packages/dateutil/easter.py | 89 + .../site-packages/dateutil/parser/__init__.py | 60 + .../site-packages/dateutil/parser/_parser.py | 1578 +++ .../dateutil/parser/isoparser.py | 406 + .../site-packages/dateutil/relativedelta.py | 590 + .../Lib/site-packages/dateutil/rrule.py | 1672 +++ .../Lib/site-packages/dateutil/tz/__init__.py | 17 + .../Lib/site-packages/dateutil/tz/_common.py | 415 + .../site-packages/dateutil/tz/_factories.py | 49 + .../Lib/site-packages/dateutil/tz/tz.py | 1785 +++ .../Lib/site-packages/dateutil/tz/win.py | 331 + .../Lib/site-packages/dateutil/tzwin.py | 2 + .../Lib/site-packages/dateutil/utils.py | 71 + .../dateutil/zoneinfo/__init__.py | 167 + .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 154226 bytes .../dateutil/zoneinfo/rebuild.py | 53 + .../Lib/site-packages/easy_install.py | 5 + .../FlaskWebenv/Lib/site-packages/editor.py | 129 + .../Lib/site-packages/flask/__init__.py | 49 + .../Lib/site-packages/flask/__main__.py | 15 + .../Lib/site-packages/flask/_compat.py | 96 + .../Lib/site-packages/flask/app.py | 2003 ++++ .../Lib/site-packages/flask/blueprints.py | 413 + .../Lib/site-packages/flask/cli.py | 517 + .../Lib/site-packages/flask/config.py | 263 + .../Lib/site-packages/flask/ctx.py | 410 + .../Lib/site-packages/flask/debughelpers.py | 155 + .../Lib/site-packages/flask/ext/__init__.py | 29 + .../Lib/site-packages/flask/exthook.py | 143 + .../Lib/site-packages/flask/globals.py | 61 + .../Lib/site-packages/flask/helpers.py | 967 ++ .../Lib/site-packages/flask/json.py | 316 + .../Lib/site-packages/flask/logging.py | 94 + .../Lib/site-packages/flask/sessions.py | 366 + .../Lib/site-packages/flask/signals.py | 56 + .../Lib/site-packages/flask/templating.py | 149 + .../Lib/site-packages/flask/testing.py | 143 + .../Lib/site-packages/flask/views.py | 149 + .../Lib/site-packages/flask/wrappers.py | 198 + .../site-packages/flask_migrate/__init__.py | 412 + .../Lib/site-packages/flask_migrate/cli.py | 226 + .../templates/flask-multidb/README | 1 + .../templates/flask-multidb/alembic.ini.mako | 45 + .../templates/flask-multidb/env.py | 158 + .../templates/flask-multidb/script.py.mako | 46 + .../flask_migrate/templates/flask/README | 1 + .../templates/flask/alembic.ini.mako | 45 + .../flask_migrate/templates/flask/env.py | 90 + .../templates/flask/script.py.mako | 24 + .../flask_sqlalchemy/__init__.py | 1001 ++ .../site-packages/flask_sqlalchemy/_compat.py | 54 + .../site-packages/flask_sqlalchemy/model.py | 154 + .../itsdangerous-1.1.0.dist-info/INSTALLER | 1 + .../itsdangerous-1.1.0.dist-info/LICENSE.rst | 47 + .../itsdangerous-1.1.0.dist-info/METADATA | 98 + .../itsdangerous-1.1.0.dist-info/RECORD | 26 + .../itsdangerous-1.1.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../Lib/site-packages/itsdangerous/_compat.py | 46 + .../Lib/site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 49 + .../Lib/site-packages/itsdangerous/exc.py | 98 + .../Lib/site-packages/itsdangerous/jws.py | 218 + .../site-packages/itsdangerous/serializer.py | 233 + .../Lib/site-packages/itsdangerous/signer.py | 179 + .../Lib/site-packages/itsdangerous/timed.py | 147 + .../site-packages/itsdangerous/url_safe.py | 65 + .../Lib/site-packages/jinja2/__init__.py | 83 + .../Lib/site-packages/jinja2/_compat.py | 99 + .../Lib/site-packages/jinja2/_identifier.py | 2 + .../Lib/site-packages/jinja2/asyncfilters.py | 146 + .../Lib/site-packages/jinja2/asyncsupport.py | 256 + .../Lib/site-packages/jinja2/bccache.py | 362 + .../Lib/site-packages/jinja2/constants.py | 32 + .../Lib/site-packages/jinja2/debug.py | 372 + .../Lib/site-packages/jinja2/defaults.py | 56 + .../Lib/site-packages/jinja2/environment.py | 1276 +++ .../Lib/site-packages/jinja2/exceptions.py | 146 + .../Lib/site-packages/jinja2/ext.py | 627 ++ .../Lib/site-packages/jinja2/filters.py | 1190 ++ .../Lib/site-packages/jinja2/idtracking.py | 286 + .../Lib/site-packages/jinja2/lexer.py | 739 ++ .../Lib/site-packages/jinja2/loaders.py | 481 + .../Lib/site-packages/jinja2/meta.py | 106 + .../Lib/site-packages/jinja2/nativetypes.py | 220 + .../Lib/site-packages/jinja2/nodes.py | 999 ++ .../Lib/site-packages/jinja2/optimizer.py | 49 + .../Lib/site-packages/jinja2/parser.py | 903 ++ .../Lib/site-packages/jinja2/runtime.py | 813 ++ .../Lib/site-packages/jinja2/sandbox.py | 475 + .../Lib/site-packages/jinja2/tests.py | 175 + .../Lib/site-packages/jinja2/utils.py | 647 ++ .../Lib/site-packages/jinja2/visitor.py | 87 + .../Lib/site-packages/mako/__init__.py | 8 + .../Lib/site-packages/mako/_ast_util.py | 851 ++ .../FlaskWebenv/Lib/site-packages/mako/ast.py | 191 + .../Lib/site-packages/mako/cache.py | 240 + .../FlaskWebenv/Lib/site-packages/mako/cmd.py | 67 + .../Lib/site-packages/mako/codegen.py | 1255 +++ .../Lib/site-packages/mako/compat.py | 201 + .../Lib/site-packages/mako/exceptions.py | 394 + .../Lib/site-packages/mako/ext/__init__.py | 0 .../Lib/site-packages/mako/ext/autohandler.py | 68 + .../Lib/site-packages/mako/ext/babelplugin.py | 50 + .../site-packages/mako/ext/beaker_cache.py | 76 + .../Lib/site-packages/mako/ext/extract.py | 108 + .../site-packages/mako/ext/linguaplugin.py | 43 + .../site-packages/mako/ext/preprocessors.py | 20 + .../site-packages/mako/ext/pygmentplugin.py | 127 + .../Lib/site-packages/mako/ext/turbogears.py | 58 + .../Lib/site-packages/mako/filters.py | 209 + .../Lib/site-packages/mako/lexer.py | 449 + .../Lib/site-packages/mako/lookup.py | 369 + .../Lib/site-packages/mako/parsetree.py | 616 ++ .../Lib/site-packages/mako/pygen.py | 303 + .../Lib/site-packages/mako/pyparser.py | 233 + .../Lib/site-packages/mako/runtime.py | 918 ++ .../Lib/site-packages/mako/template.py | 746 ++ .../Lib/site-packages/mako/util.py | 382 + .../Lib/site-packages/markupsafe/__init__.py | 327 + .../Lib/site-packages/markupsafe/_compat.py | 33 + .../site-packages/markupsafe/_constants.py | 264 + .../Lib/site-packages/markupsafe/_native.py | 69 + .../markupsafe/_speedups.cp36-win_amd64.pyd | Bin 0 -> 15360 bytes .../pip-18.1.dist-info/INSTALLER | 1 + .../pip-18.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-18.1.dist-info/METADATA | 70 + .../site-packages/pip-18.1.dist-info/RECORD | 614 ++ .../site-packages/pip-18.1.dist-info/WHEEL | 6 + .../pip-18.1.dist-info/entry_points.txt | 5 + .../pip-18.1.dist-info/top_level.txt | 1 + .../Lib/site-packages/pip/__init__.py | 1 + .../Lib/site-packages/pip/__main__.py | 19 + .../site-packages/pip/_internal/__init__.py | 78 + .../site-packages/pip/_internal/build_env.py | 142 + .../Lib/site-packages/pip/_internal/cache.py | 202 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 278 + .../pip/_internal/cli/cmdoptions.py | 714 ++ .../pip/_internal/cli/main_parser.py | 96 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 174 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 535 + .../pip/_internal/commands/list.py | 306 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 387 + .../site-packages/pip/_internal/download.py | 921 ++ .../site-packages/pip/_internal/exceptions.py | 268 + .../Lib/site-packages/pip/_internal/index.py | 899 ++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 23 + .../pip/_internal/models/format_control.py | 62 + .../pip/_internal/models/index.py | 29 + .../pip/_internal/models/link.py | 141 + .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 148 + .../pip/_internal/operations/freeze.py | 264 + .../pip/_internal/operations/prepare.py | 355 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../site-packages/pip/_internal/pyproject.py | 144 + .../pip/_internal/req/__init__.py | 69 + .../pip/_internal/req/constructors.py | 298 + .../pip/_internal/req/req_file.py | 340 + .../pip/_internal/req/req_install.py | 860 ++ .../pip/_internal/req/req_set.py | 181 + .../pip/_internal/req/req_tracker.py | 76 + .../pip/_internal/req/req_uninstall.py | 460 + .../site-packages/pip/_internal/resolve.py | 353 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/compat.py | 248 + .../pip/_internal/utils/deprecation.py | 89 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 225 + .../site-packages/pip/_internal/utils/misc.py | 940 ++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 154 + .../pip/_internal/utils/packaging.py | 75 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 + .../pip/_internal/vcs/__init__.py | 509 + .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 346 + .../pip/_internal/vcs/mercurial.py | 101 + .../pip/_internal/vcs/subversion.py | 213 + .../Lib/site-packages/pip/_internal/wheel.py | 831 ++ .../Lib/site-packages/pip/_vendor/__init__.py | 110 + .../Lib/site-packages/pip/_vendor/appdirs.py | 604 + .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../pip/_vendor/certifi/cacert.pem | 4300 ++++++++ .../site-packages/pip/_vendor/certifi/core.py | 37 + .../pip/_vendor/chardet/__init__.py | 39 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 236 + .../pip/_vendor/colorama/initialise.py | 82 + .../pip/_vendor/colorama/win32.py | 156 + .../pip/_vendor/colorama/winterm.py | 162 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/compat.py | 1120 ++ .../pip/_vendor/distlib/database.py | 1336 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1292 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1091 ++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 415 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1755 +++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 984 ++ .../Lib/site-packages/pip/_vendor/distro.py | 1197 ++ .../pip/_vendor/html5lib/__init__.py | 35 + .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 399 + .../pip/_vendor/idna/idnadata.py | 1893 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/lockfile/__init__.py | 347 + .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 21 + .../pip/_vendor/packaging/__init__.py | 14 + .../pip/_vendor/packaging/_compat.py | 30 + .../pip/_vendor/packaging/_structures.py | 70 + .../pip/_vendor/packaging/markers.py | 301 + .../pip/_vendor/packaging/requirements.py | 130 + .../pip/_vendor/packaging/specifiers.py | 774 ++ .../pip/_vendor/packaging/utils.py | 63 + .../pip/_vendor/packaging/version.py | 441 + .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/_in_process.py | 182 + .../site-packages/pip/_vendor/pep517/check.py | 194 + .../pip/_vendor/pep517/colorlog.py | 110 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 150 + .../pip/_vendor/pep517/wrappers.py | 134 + .../pip/_vendor/pkg_resources/__init__.py | 3149 ++++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../site-packages/pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../site-packages/pip/_vendor/pyparsing.py | 5742 ++++++++++ .../pip/_vendor/pytoml/__init__.py | 3 + .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 374 + .../pip/_vendor/pytoml/writer.py | 127 + .../pip/_vendor/requests/__init__.py | 138 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 530 + .../site-packages/pip/_vendor/requests/api.py | 152 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 75 + .../pip/_vendor/requests/cookies.py | 546 + .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 120 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 952 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 741 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 976 ++ .../Lib/site-packages/pip/_vendor/retrying.py | 267 + .../Lib/site-packages/pip/_vendor/six.py | 891 ++ .../pip/_vendor/urllib3/__init__.py | 97 + .../pip/_vendor/urllib3/_collections.py | 332 + .../pip/_vendor/urllib3/connection.py | 403 + .../pip/_vendor/urllib3/connectionpool.py | 906 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 305 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 112 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 457 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 + .../_vendor/urllib3/packages/ordered_dict.py | 259 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 157 + .../pip/_vendor/urllib3/poolmanager.py | 449 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 676 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../pip/_vendor/urllib3/util/connection.py | 126 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 81 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 396 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../site-packages/pkg_resources/py31compat.py | 23 + .../pyodbc-4.0.24.dist-info/DESCRIPTION.rst | 3 + .../pyodbc-4.0.24.dist-info/INSTALLER | 1 + .../pyodbc-4.0.24.dist-info/METADATA | 27 + .../pyodbc-4.0.24.dist-info/RECORD | 8 + .../pyodbc-4.0.24.dist-info/WHEEL | 5 + .../pyodbc-4.0.24.dist-info/top_level.txt | 1 + .../site-packages/pyodbc.cp36-win_amd64.pyd | Bin 0 -> 144896 bytes .../python_dateutil-2.7.5.dist-info/INSTALLER | 1 + .../LICENSE.txt | 54 + .../python_dateutil-2.7.5.dist-info/METADATA | 190 + .../python_dateutil-2.7.5.dist-info/RECORD | 44 + .../python_dateutil-2.7.5.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../python_dateutil-2.7.5.dist-info/zip-safe | 1 + .../python_editor-1.0.3.dist-info/INSTALLER | 1 + .../python_editor-1.0.3.dist-info/LICENSE | 202 + .../python_editor-1.0.3.dist-info/METADATA | 26 + .../python_editor-1.0.3.dist-info/RECORD | 8 + .../python_editor-1.0.3.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../DESCRIPTION.rst | 36 + .../setuptools-39.0.1.dist-info/INSTALLER | 1 + .../setuptools-39.0.1.dist-info/LICENSE.txt | 19 + .../setuptools-39.0.1.dist-info/METADATA | 71 + .../setuptools-39.0.1.dist-info/RECORD | 188 + .../setuptools-39.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-39.0.1.dist-info/top_level.txt | 3 + .../setuptools-39.0.1.dist-info/zip-safe | 1 + .../setuptools-40.6.2.dist-info/INSTALLER | 1 + .../setuptools-40.6.2.dist-info/LICENSE | 19 + .../setuptools-40.6.2.dist-info/METADATA | 73 + .../setuptools-40.6.2.dist-info/RECORD | 188 + .../setuptools-40.6.2.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-40.6.2.dist-info/top_level.txt | 3 + .../setuptools-40.6.2.dist-info/zip-safe | 1 + .../Lib/site-packages/setuptools/__init__.py | 195 + .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 182 + .../setuptools/command/__init__.py | 18 + .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 218 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/egg_info.py | 716 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 200 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 270 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../Lib/site-packages/setuptools/config.py | 635 ++ .../Lib/site-packages/setuptools/dep_util.py | 23 + .../Lib/site-packages/setuptools/depends.py | 186 + .../Lib/site-packages/setuptools/dist.py | 1147 ++ .../Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../Lib/site-packages/setuptools/glibc.py | 86 + .../Lib/site-packages/setuptools/glob.py | 174 + .../Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../Lib/site-packages/setuptools/monkey.py | 179 + .../Lib/site-packages/setuptools/msvc.py | 1301 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1128 ++ .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/py36compat.py | 82 + .../Lib/site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 210 + .../setuptools/windows_support.py | 29 + .../six-1.11.0.dist-info/DESCRIPTION.rst | 27 + .../six-1.11.0.dist-info/INSTALLER | 1 + .../six-1.11.0.dist-info/METADATA | 43 + .../site-packages/six-1.11.0.dist-info/RECORD | 9 + .../site-packages/six-1.11.0.dist-info/WHEEL | 6 + .../six-1.11.0.dist-info/top_level.txt | 1 + .../FlaskWebenv/Lib/site-packages/six.py | 891 ++ .../Lib/site-packages/sqlalchemy/__init__.py | 148 + .../sqlalchemy/connectors/__init__.py | 10 + .../sqlalchemy/connectors/mxodbc.py | 150 + .../sqlalchemy/connectors/pyodbc.py | 164 + .../sqlalchemy/connectors/zxJDBC.py | 60 + .../sqlalchemy/cprocessors.cp36-win_amd64.pyd | Bin 0 -> 16896 bytes .../cresultproxy.cp36-win_amd64.pyd | Bin 0 -> 17920 bytes .../sqlalchemy/cutils.cp36-win_amd64.pyd | Bin 0 -> 11776 bytes .../sqlalchemy/databases/__init__.py | 30 + .../sqlalchemy/dialects/__init__.py | 56 + .../sqlalchemy/dialects/firebird/__init__.py | 20 + .../sqlalchemy/dialects/firebird/base.py | 741 ++ .../sqlalchemy/dialects/firebird/fdb.py | 118 + .../dialects/firebird/kinterbasdb.py | 184 + .../sqlalchemy/dialects/mssql/__init__.py | 26 + .../sqlalchemy/dialects/mssql/adodbapi.py | 87 + .../sqlalchemy/dialects/mssql/base.py | 2295 ++++ .../dialects/mssql/information_schema.py | 139 + .../sqlalchemy/dialects/mssql/mxodbc.py | 139 + .../sqlalchemy/dialects/mssql/pymssql.py | 116 + .../sqlalchemy/dialects/mssql/pyodbc.py | 310 + .../sqlalchemy/dialects/mssql/zxjdbc.py | 69 + .../sqlalchemy/dialects/mysql/__init__.py | 34 + .../sqlalchemy/dialects/mysql/base.py | 2438 ++++ .../sqlalchemy/dialects/mysql/cymysql.py | 76 + .../sqlalchemy/dialects/mysql/dml.py | 80 + .../sqlalchemy/dialects/mysql/enumerated.py | 311 + .../sqlalchemy/dialects/mysql/gaerdbms.py | 102 + .../sqlalchemy/dialects/mysql/json.py | 79 + .../dialects/mysql/mysqlconnector.py | 251 + .../sqlalchemy/dialects/mysql/mysqldb.py | 209 + .../sqlalchemy/dialects/mysql/oursql.py | 243 + .../sqlalchemy/dialects/mysql/pymysql.py | 70 + .../sqlalchemy/dialects/mysql/pyodbc.py | 79 + .../sqlalchemy/dialects/mysql/reflection.py | 479 + .../sqlalchemy/dialects/mysql/types.py | 766 ++ .../sqlalchemy/dialects/mysql/zxjdbc.py | 117 + .../sqlalchemy/dialects/oracle/__init__.py | 24 + .../sqlalchemy/dialects/oracle/base.py | 1779 +++ .../sqlalchemy/dialects/oracle/cx_oracle.py | 1020 ++ .../sqlalchemy/dialects/oracle/zxjdbc.py | 235 + .../dialects/postgresql/__init__.py | 37 + .../sqlalchemy/dialects/postgresql/array.py | 303 + .../sqlalchemy/dialects/postgresql/base.py | 3164 ++++++ .../sqlalchemy/dialects/postgresql/dml.py | 214 + .../sqlalchemy/dialects/postgresql/ext.py | 230 + .../sqlalchemy/dialects/postgresql/hstore.py | 420 + .../sqlalchemy/dialects/postgresql/json.py | 300 + .../sqlalchemy/dialects/postgresql/pg8000.py | 295 + .../dialects/postgresql/psycopg2.py | 740 ++ .../dialects/postgresql/psycopg2cffi.py | 61 + .../dialects/postgresql/pygresql.py | 243 + .../dialects/postgresql/pypostgresql.py | 97 + .../sqlalchemy/dialects/postgresql/ranges.py | 172 + .../sqlalchemy/dialects/postgresql/zxjdbc.py | 46 + .../sqlalchemy/dialects/sqlite/__init__.py | 21 + .../sqlalchemy/dialects/sqlite/base.py | 1585 +++ .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 130 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 377 + .../sqlalchemy/dialects/sybase/__init__.py | 27 + .../sqlalchemy/dialects/sybase/base.py | 839 ++ .../sqlalchemy/dialects/sybase/mxodbc.py | 33 + .../sqlalchemy/dialects/sybase/pyodbc.py | 86 + .../sqlalchemy/dialects/sybase/pysybase.py | 102 + .../sqlalchemy/engine/__init__.py | 472 + .../site-packages/sqlalchemy/engine/base.py | 2234 ++++ .../sqlalchemy/engine/default.py | 1364 +++ .../sqlalchemy/engine/interfaces.py | 1305 +++ .../sqlalchemy/engine/reflection.py | 877 ++ .../site-packages/sqlalchemy/engine/result.py | 1448 +++ .../sqlalchemy/engine/strategies.py | 285 + .../sqlalchemy/engine/threadlocal.py | 138 + .../site-packages/sqlalchemy/engine/url.py | 288 + .../site-packages/sqlalchemy/engine/util.py | 74 + .../sqlalchemy/event/__init__.py | 11 + .../Lib/site-packages/sqlalchemy/event/api.py | 188 + .../site-packages/sqlalchemy/event/attr.py | 401 + .../site-packages/sqlalchemy/event/base.py | 289 + .../site-packages/sqlalchemy/event/legacy.py | 169 + .../sqlalchemy/event/registry.py | 262 + .../Lib/site-packages/sqlalchemy/events.py | 1274 +++ .../Lib/site-packages/sqlalchemy/exc.py | 480 + .../site-packages/sqlalchemy/ext/__init__.py | 11 + .../sqlalchemy/ext/associationproxy.py | 1145 ++ .../site-packages/sqlalchemy/ext/automap.py | 1055 ++ .../Lib/site-packages/sqlalchemy/ext/baked.py | 585 + .../site-packages/sqlalchemy/ext/compiler.py | 474 + .../sqlalchemy/ext/declarative/__init__.py | 18 + .../sqlalchemy/ext/declarative/api.py | 731 ++ .../sqlalchemy/ext/declarative/base.py | 756 ++ .../sqlalchemy/ext/declarative/clsregistry.py | 328 + .../sqlalchemy/ext/horizontal_shard.py | 196 + .../site-packages/sqlalchemy/ext/hybrid.py | 1149 ++ .../site-packages/sqlalchemy/ext/indexable.py | 349 + .../sqlalchemy/ext/instrumentation.py | 414 + .../site-packages/sqlalchemy/ext/mutable.py | 950 ++ .../sqlalchemy/ext/orderinglist.py | 380 + .../sqlalchemy/ext/serializer.py | 159 + .../site-packages/sqlalchemy/inspection.py | 93 + .../site-packages/sqlalchemy/interfaces.py | 312 + .../Lib/site-packages/sqlalchemy/log.py | 217 + .../site-packages/sqlalchemy/orm/__init__.py | 297 + .../sqlalchemy/orm/attributes.py | 1698 +++ .../Lib/site-packages/sqlalchemy/orm/base.py | 547 + .../sqlalchemy/orm/collections.py | 1551 +++ .../sqlalchemy/orm/dependency.py | 1165 ++ .../sqlalchemy/orm/deprecated_interfaces.py | 487 + .../sqlalchemy/orm/descriptor_props.py | 772 ++ .../site-packages/sqlalchemy/orm/dynamic.py | 373 + .../site-packages/sqlalchemy/orm/evaluator.py | 150 + .../site-packages/sqlalchemy/orm/events.py | 2275 ++++ .../Lib/site-packages/sqlalchemy/orm/exc.py | 167 + .../site-packages/sqlalchemy/orm/identity.py | 355 + .../sqlalchemy/orm/instrumentation.py | 573 + .../sqlalchemy/orm/interfaces.py | 710 ++ .../site-packages/sqlalchemy/orm/loading.py | 881 ++ .../site-packages/sqlalchemy/orm/mapper.py | 3180 ++++++ .../sqlalchemy/orm/path_registry.py | 271 + .../sqlalchemy/orm/persistence.py | 1627 +++ .../sqlalchemy/orm/properties.py | 277 + .../Lib/site-packages/sqlalchemy/orm/query.py | 4351 ++++++++ .../sqlalchemy/orm/relationships.py | 2893 +++++ .../site-packages/sqlalchemy/orm/scoping.py | 181 + .../site-packages/sqlalchemy/orm/session.py | 3153 ++++++ .../Lib/site-packages/sqlalchemy/orm/state.py | 887 ++ .../sqlalchemy/orm/strategies.py | 2039 ++++ .../sqlalchemy/orm/strategy_options.py | 1488 +++ .../Lib/site-packages/sqlalchemy/orm/sync.py | 140 + .../sqlalchemy/orm/unitofwork.py | 704 ++ .../Lib/site-packages/sqlalchemy/orm/util.py | 1130 ++ .../Lib/site-packages/sqlalchemy/pool.py | 1500 +++ .../site-packages/sqlalchemy/processors.py | 148 + .../Lib/site-packages/sqlalchemy/schema.py | 70 + .../site-packages/sqlalchemy/sql/__init__.py | 101 + .../sqlalchemy/sql/annotation.py | 206 + .../Lib/site-packages/sqlalchemy/sql/base.py | 636 ++ .../site-packages/sqlalchemy/sql/compiler.py | 3232 ++++++ .../Lib/site-packages/sqlalchemy/sql/crud.py | 700 ++ .../Lib/site-packages/sqlalchemy/sql/ddl.py | 1138 ++ .../sqlalchemy/sql/default_comparator.py | 325 + .../Lib/site-packages/sqlalchemy/sql/dml.py | 879 ++ .../site-packages/sqlalchemy/sql/elements.py | 4470 ++++++++ .../sqlalchemy/sql/expression.py | 145 + .../site-packages/sqlalchemy/sql/functions.py | 883 ++ .../site-packages/sqlalchemy/sql/naming.py | 146 + .../site-packages/sqlalchemy/sql/operators.py | 1452 +++ .../site-packages/sqlalchemy/sql/schema.py | 4147 +++++++ .../sqlalchemy/sql/selectable.py | 3729 +++++++ .../site-packages/sqlalchemy/sql/sqltypes.py | 2734 +++++ .../site-packages/sqlalchemy/sql/type_api.py | 1413 +++ .../Lib/site-packages/sqlalchemy/sql/util.py | 766 ++ .../site-packages/sqlalchemy/sql/visitors.py | 328 + .../sqlalchemy/testing/__init__.py | 36 + .../sqlalchemy/testing/assertions.py | 543 + .../sqlalchemy/testing/assertsql.py | 399 + .../sqlalchemy/testing/config.py | 101 + .../sqlalchemy/testing/engines.py | 371 + .../sqlalchemy/testing/entities.py | 101 + .../sqlalchemy/testing/exclusions.py | 446 + .../sqlalchemy/testing/fixtures.py | 386 + .../site-packages/sqlalchemy/testing/mock.py | 21 + .../sqlalchemy/testing/pickleable.py | 143 + .../sqlalchemy/testing/plugin/__init__.py | 0 .../sqlalchemy/testing/plugin/bootstrap.py | 44 + .../sqlalchemy/testing/plugin/noseplugin.py | 107 + .../sqlalchemy/testing/plugin/plugin_base.py | 586 + .../sqlalchemy/testing/plugin/pytestplugin.py | 210 + .../sqlalchemy/testing/profiling.py | 265 + .../sqlalchemy/testing/provision.py | 423 + .../sqlalchemy/testing/replay_fixture.py | 172 + .../sqlalchemy/testing/requirements.py | 924 ++ .../sqlalchemy/testing/runner.py | 50 + .../sqlalchemy/testing/schema.py | 100 + .../sqlalchemy/testing/suite/__init__.py | 11 + .../sqlalchemy/testing/suite/test_cte.py | 193 + .../sqlalchemy/testing/suite/test_ddl.py | 65 + .../sqlalchemy/testing/suite/test_dialect.py | 120 + .../sqlalchemy/testing/suite/test_insert.py | 319 + .../testing/suite/test_reflection.py | 998 ++ .../sqlalchemy/testing/suite/test_results.py | 367 + .../sqlalchemy/testing/suite/test_select.py | 515 + .../sqlalchemy/testing/suite/test_sequence.py | 148 + .../sqlalchemy/testing/suite/test_types.py | 1005 ++ .../testing/suite/test_update_delete.py | 63 + .../site-packages/sqlalchemy/testing/util.py | 280 + .../sqlalchemy/testing/warnings.py | 41 + .../Lib/site-packages/sqlalchemy/types.py | 81 + .../site-packages/sqlalchemy/util/__init__.py | 49 + .../sqlalchemy/util/_collections.py | 1056 ++ .../site-packages/sqlalchemy/util/compat.py | 338 + .../sqlalchemy/util/deprecations.py | 146 + .../sqlalchemy/util/langhelpers.py | 1422 +++ .../site-packages/sqlalchemy/util/queue.py | 199 + .../sqlalchemy/util/topological.py | 100 + .../virtualenv-16.1.0.dist-info/AUTHORS.txt | 92 + .../virtualenv-16.1.0.dist-info/INSTALLER | 1 + .../virtualenv-16.1.0.dist-info/LICENSE.txt | 22 + .../virtualenv-16.1.0.dist-info/METADATA | 96 + .../virtualenv-16.1.0.dist-info/RECORD | 16 + .../virtualenv-16.1.0.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../virtualenv-16.1.0.dist-info/top_level.txt | 2 + .../Lib/site-packages/virtualenv.py | 2466 +++++ .../virtualenv_support/__init__.py | 0 .../pip-18.1-py2.py3-none-any.whl | Bin 0 -> 1323545 bytes .../setuptools-40.5.0-py2.py3-none-any.whl | Bin 0 -> 569846 bytes .../wheel-0.32.2-py2.py3-none-any.whl | Bin 0 -> 21464 bytes .../Lib/site-packages/werkzeug/__init__.py | 151 + .../Lib/site-packages/werkzeug/_compat.py | 206 + .../Lib/site-packages/werkzeug/_internal.py | 419 + .../Lib/site-packages/werkzeug/_reloader.py | 277 + .../werkzeug/contrib/__init__.py | 16 + .../site-packages/werkzeug/contrib/atom.py | 355 + .../site-packages/werkzeug/contrib/cache.py | 913 ++ .../site-packages/werkzeug/contrib/fixers.py | 254 + .../site-packages/werkzeug/contrib/iterio.py | 352 + .../werkzeug/contrib/jsrouting.py | 264 + .../site-packages/werkzeug/contrib/limiter.py | 41 + .../site-packages/werkzeug/contrib/lint.py | 343 + .../werkzeug/contrib/profiler.py | 147 + .../werkzeug/contrib/securecookie.py | 323 + .../werkzeug/contrib/sessions.py | 352 + .../werkzeug/contrib/testtools.py | 73 + .../werkzeug/contrib/wrappers.py | 284 + .../site-packages/werkzeug/datastructures.py | 2762 +++++ .../site-packages/werkzeug/debug/__init__.py | 470 + .../site-packages/werkzeug/debug/console.py | 215 + .../Lib/site-packages/werkzeug/debug/repr.py | 280 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 205 + .../werkzeug/debug/shared/jquery.js | 5 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 143 + .../site-packages/werkzeug/debug/tbtools.py | 556 + .../Lib/site-packages/werkzeug/exceptions.py | 719 ++ .../Lib/site-packages/werkzeug/filesystem.py | 66 + .../Lib/site-packages/werkzeug/formparser.py | 534 + .../Lib/site-packages/werkzeug/http.py | 1158 ++ .../Lib/site-packages/werkzeug/local.py | 420 + .../site-packages/werkzeug/posixemulation.py | 106 + .../Lib/site-packages/werkzeug/routing.py | 1792 +++ .../Lib/site-packages/werkzeug/script.py | 318 + .../Lib/site-packages/werkzeug/security.py | 270 + .../Lib/site-packages/werkzeug/serving.py | 862 ++ .../Lib/site-packages/werkzeug/test.py | 948 ++ .../Lib/site-packages/werkzeug/testapp.py | 230 + .../Lib/site-packages/werkzeug/urls.py | 1007 ++ .../Lib/site-packages/werkzeug/useragents.py | 212 + .../Lib/site-packages/werkzeug/utils.py | 628 ++ .../Lib/site-packages/werkzeug/websocket.py | 337 + .../Lib/site-packages/werkzeug/wrappers.py | 2028 ++++ .../Lib/site-packages/werkzeug/wsgi.py | 1364 +++ .../wheel-0.32.3.dist-info/INSTALLER | 1 + .../wheel-0.32.3.dist-info/LICENSE.txt | 22 + .../wheel-0.32.3.dist-info/METADATA | 60 + .../wheel-0.32.3.dist-info/RECORD | 34 + .../wheel-0.32.3.dist-info/WHEEL | 6 + .../wheel-0.32.3.dist-info/entry_points.txt | 6 + .../wheel-0.32.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/wheel/__init__.py | 2 + .../Lib/site-packages/wheel/__main__.py | 19 + .../Lib/site-packages/wheel/bdist_wheel.py | 368 + .../Lib/site-packages/wheel/cli/__init__.py | 87 + .../Lib/site-packages/wheel/cli/convert.py | 269 + .../Lib/site-packages/wheel/cli/install.py | 0 .../Lib/site-packages/wheel/cli/pack.py | 54 + .../Lib/site-packages/wheel/cli/unpack.py | 25 + .../Lib/site-packages/wheel/metadata.py | 141 + .../Lib/site-packages/wheel/pep425tags.py | 185 + .../Lib/site-packages/wheel/pkginfo.py | 43 + .../Lib/site-packages/wheel/util.py | 41 + .../Lib/site-packages/wheel/wheelfile.py | 160 + flaskwebproject/FlaskWebenv/Lib/site.py | 833 ++ .../FlaskWebenv/Lib/sre_compile.py | 580 + .../FlaskWebenv/Lib/sre_constants.py | 233 + flaskwebproject/FlaskWebenv/Lib/sre_parse.py | 973 ++ flaskwebproject/FlaskWebenv/Lib/stat.py | 178 + flaskwebproject/FlaskWebenv/Lib/struct.py | 15 + flaskwebproject/FlaskWebenv/Lib/tarfile.py | 2548 +++++ .../FlaskWebenv/Lib/tcl8.6/init.tcl | 818 ++ flaskwebproject/FlaskWebenv/Lib/tempfile.py | 813 ++ flaskwebproject/FlaskWebenv/Lib/token.py | 143 + flaskwebproject/FlaskWebenv/Lib/tokenize.py | 793 ++ flaskwebproject/FlaskWebenv/Lib/types.py | 266 + flaskwebproject/FlaskWebenv/Lib/warnings.py | 526 + flaskwebproject/FlaskWebenv/Lib/weakref.py | 632 ++ .../FlaskWebenv/Scripts/Activate.ps1 | 150 + .../FlaskWebenv/Scripts/_asyncio.pyd | Bin 0 -> 60056 bytes flaskwebproject/FlaskWebenv/Scripts/_bz2.pyd | Bin 0 -> 94872 bytes .../FlaskWebenv/Scripts/_ctypes.pyd | Bin 0 -> 131224 bytes .../FlaskWebenv/Scripts/_ctypes_test.pyd | Bin 0 -> 31896 bytes .../FlaskWebenv/Scripts/_decimal.pyd | Bin 0 -> 269464 bytes .../FlaskWebenv/Scripts/_distutils_findvs.pyd | Bin 0 -> 25240 bytes .../FlaskWebenv/Scripts/_elementtree.pyd | Bin 0 -> 170136 bytes .../FlaskWebenv/Scripts/_hashlib.pyd | Bin 0 -> 1663640 bytes flaskwebproject/FlaskWebenv/Scripts/_lzma.pyd | Bin 0 -> 254616 bytes flaskwebproject/FlaskWebenv/Scripts/_msi.pyd | Bin 0 -> 39576 bytes .../FlaskWebenv/Scripts/_multiprocessing.pyd | Bin 0 -> 29848 bytes .../FlaskWebenv/Scripts/_overlapped.pyd | Bin 0 -> 43160 bytes .../FlaskWebenv/Scripts/_socket.pyd | Bin 0 -> 73880 bytes .../FlaskWebenv/Scripts/_sqlite3.pyd | Bin 0 -> 85656 bytes flaskwebproject/FlaskWebenv/Scripts/_ssl.pyd | Bin 0 -> 2063000 bytes .../FlaskWebenv/Scripts/_testbuffer.pyd | Bin 0 -> 52376 bytes .../FlaskWebenv/Scripts/_testcapi.pyd | Bin 0 -> 94360 bytes .../FlaskWebenv/Scripts/_testconsole.pyd | Bin 0 -> 24216 bytes .../Scripts/_testimportmultiple.pyd | Bin 0 -> 22680 bytes .../FlaskWebenv/Scripts/_testmultiphase.pyd | Bin 0 -> 31896 bytes .../FlaskWebenv/Scripts/_tkinter.pyd | Bin 0 -> 69784 bytes flaskwebproject/FlaskWebenv/Scripts/activate | 78 + .../FlaskWebenv/Scripts/activate.bat | 30 + .../FlaskWebenv/Scripts/activate_this.py | 36 + .../FlaskWebenv/Scripts/deactivate.bat | 20 + .../FlaskWebenv/Scripts/easy_install-3.6.exe | Bin 0 -> 102833 bytes flaskwebproject/FlaskWebenv/Scripts/flask.exe | Bin 0 -> 102811 bytes flaskwebproject/FlaskWebenv/Scripts/pip.exe | Bin 0 -> 102815 bytes .../FlaskWebenv/Scripts/pyexpat.pyd | Bin 0 -> 197784 bytes .../FlaskWebenv/Scripts/select.pyd | Bin 0 -> 27288 bytes .../FlaskWebenv/Scripts/sqlite3.dll | Bin 0 -> 1153176 bytes .../FlaskWebenv/Scripts/tcl86t.dll | Bin 0 -> 1666048 bytes flaskwebproject/FlaskWebenv/Scripts/tk86t.dll | Bin 0 -> 1967104 bytes .../FlaskWebenv/Scripts/unicodedata.pyd | Bin 0 -> 906392 bytes .../FlaskWebenv/Scripts/vcruntime140.dll | Bin 0 -> 87888 bytes .../FlaskWebenv/Scripts/winsound.pyd | Bin 0 -> 28312 bytes flaskwebproject/FlaskWebenv/pyvenv.cfg | 3 + .../FlaskWebenv/tcl/tcl8.6/auto.tcl | 651 ++ .../FlaskWebenv/tcl/tcl8.6/encoding/ascii.enc | 20 + .../tcl/tcl8.6/encoding/cp1250.enc | 20 + .../tcl/tcl8.6/encoding/cp1251.enc | 20 + .../tcl/tcl8.6/encoding/cp1252.enc | 20 + .../tcl/tcl8.6/encoding/cp1253.enc | 20 + .../tcl/tcl8.6/encoding/cp1254.enc | 20 + .../tcl/tcl8.6/encoding/cp1255.enc | 20 + .../tcl/tcl8.6/encoding/cp1256.enc | 20 + .../tcl/tcl8.6/encoding/cp1257.enc | 20 + .../tcl/tcl8.6/encoding/cp1258.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp437.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp737.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp775.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp850.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp852.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp855.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp857.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp860.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp861.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp862.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp863.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp864.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp865.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp866.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp869.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp874.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/encoding/cp932.enc | 801 ++ .../tcl/tcl8.6/encoding/dingbats.enc | 20 + .../tcl/tcl8.6/encoding/ebcdic.enc | 19 + .../tcl/tcl8.6/encoding/gb1988.enc | 20 + .../tcl/tcl8.6/encoding/iso2022-jp.enc | 12 + .../tcl/tcl8.6/encoding/iso2022-kr.enc | 7 + .../tcl/tcl8.6/encoding/iso2022.enc | 14 + .../tcl/tcl8.6/encoding/iso8859-1.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-10.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-13.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-14.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-15.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-16.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-2.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-3.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-4.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-5.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-6.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-7.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-8.enc | 20 + .../tcl/tcl8.6/encoding/iso8859-9.enc | 20 + .../tcl/tcl8.6/encoding/jis0201.enc | 20 + .../tcl/tcl8.6/encoding/koi8-r.enc | 20 + .../tcl/tcl8.6/encoding/koi8-u.enc | 20 + .../tcl/tcl8.6/encoding/macCentEuro.enc | 20 + .../tcl/tcl8.6/encoding/macCroatian.enc | 20 + .../tcl/tcl8.6/encoding/macCyrillic.enc | 20 + .../tcl/tcl8.6/encoding/macDingbats.enc | 20 + .../tcl/tcl8.6/encoding/macGreek.enc | 20 + .../tcl/tcl8.6/encoding/macIceland.enc | 20 + .../tcl/tcl8.6/encoding/macJapan.enc | 785 ++ .../tcl/tcl8.6/encoding/macRoman.enc | 20 + .../tcl/tcl8.6/encoding/macRomania.enc | 20 + .../tcl/tcl8.6/encoding/macThai.enc | 20 + .../tcl/tcl8.6/encoding/macTurkish.enc | 20 + .../tcl/tcl8.6/encoding/macUkraine.enc | 20 + .../tcl/tcl8.6/encoding/shiftjis.enc | 690 ++ .../tcl/tcl8.6/encoding/symbol.enc | 20 + .../tcl/tcl8.6/encoding/tis-620.enc | 20 + .../FlaskWebenv/tcl/tcl8.6/history.tcl | 311 + .../FlaskWebenv/tcl/tcl8.6/http1.0/http.tcl | 377 + .../tcl/tcl8.6/http1.0/pkgIndex.tcl | 11 + .../FlaskWebenv/tcl/tcl8.6/init.tcl | 818 ++ .../FlaskWebenv/tcl/tcl8.6/msgs/af.msg | 49 + .../FlaskWebenv/tcl/tcl8.6/msgs/af_za.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/ar.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/ar_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/ar_jo.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/ar_lb.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/ar_sy.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/be.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/bg.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/bn.msg | 49 + .../FlaskWebenv/tcl/tcl8.6/msgs/bn_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/ca.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/cs.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/da.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/de.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/de_at.msg | 35 + .../FlaskWebenv/tcl/tcl8.6/msgs/de_be.msg | 53 + .../FlaskWebenv/tcl/tcl8.6/msgs/el.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_au.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_be.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_bw.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_ca.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_gb.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_hk.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_ie.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_in.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_nz.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_ph.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_sg.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_za.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/en_zw.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/eo.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/es.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_ar.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_bo.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_cl.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_co.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_cr.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_do.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_ec.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_gt.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_hn.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_mx.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_ni.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_pa.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_pe.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_pr.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_py.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_sv.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_uy.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/es_ve.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/et.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/eu.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/eu_es.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/fa.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/fa_in.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/fa_ir.msg | 9 + .../FlaskWebenv/tcl/tcl8.6/msgs/fi.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/fo.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/fo_fo.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/fr.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/fr_be.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/fr_ca.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/fr_ch.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/ga.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/ga_ie.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/gl.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/gl_es.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/gv.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/gv_gb.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/he.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/hi.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/hi_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/hr.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/hu.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/id.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/id_id.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/is.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/it.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/it_ch.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/ja.msg | 44 + .../FlaskWebenv/tcl/tcl8.6/msgs/kl.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/kl_gl.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/ko.msg | 55 + .../FlaskWebenv/tcl/tcl8.6/msgs/ko_kr.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/kok.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/kok_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/kw.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/kw_gb.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/lt.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/lv.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/mk.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/mr.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/mr_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/ms.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/ms_my.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/mt.msg | 27 + .../FlaskWebenv/tcl/tcl8.6/msgs/nb.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/nl.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/nl_be.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/nn.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/pl.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/pt.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/pt_br.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/ro.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/ru.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/ru_ua.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/sh.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/sk.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/sl.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/sq.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/sr.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/sv.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/sw.msg | 49 + .../FlaskWebenv/tcl/tcl8.6/msgs/ta.msg | 39 + .../FlaskWebenv/tcl/tcl8.6/msgs/ta_in.msg | 6 + .../FlaskWebenv/tcl/tcl8.6/msgs/te.msg | 47 + .../FlaskWebenv/tcl/tcl8.6/msgs/te_in.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/th.msg | 54 + .../FlaskWebenv/tcl/tcl8.6/msgs/tr.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/uk.msg | 52 + .../FlaskWebenv/tcl/tcl8.6/msgs/vi.msg | 50 + .../FlaskWebenv/tcl/tcl8.6/msgs/zh.msg | 55 + .../FlaskWebenv/tcl/tcl8.6/msgs/zh_cn.msg | 7 + .../FlaskWebenv/tcl/tcl8.6/msgs/zh_hk.msg | 28 + .../FlaskWebenv/tcl/tcl8.6/msgs/zh_sg.msg | 8 + .../FlaskWebenv/tcl/tcl8.6/msgs/zh_tw.msg | 8 + .../tcl/tcl8.6/opt0.4/optparse.tcl | 1072 ++ .../tcl/tcl8.6/opt0.4/pkgIndex.tcl | 12 + .../FlaskWebenv/tcl/tcl8.6/package.tcl | 747 ++ .../FlaskWebenv/tcl/tcl8.6/parray.tcl | 28 + .../FlaskWebenv/tcl/tcl8.6/safe.tcl | 1133 ++ .../FlaskWebenv/tcl/tcl8.6/tclIndex | 75 + flaskwebproject/FlaskWebenv/tcl/tcl8.6/tm.tcl | 375 + .../tcl/tcl8.6/tzdata/Africa/Abidjan | 6 + .../tcl/tcl8.6/tzdata/Africa/Accra | 52 + .../tcl/tcl8.6/tzdata/Africa/Addis_Ababa | 5 + .../tcl/tcl8.6/tzdata/Africa/Algiers | 39 + .../tcl/tcl8.6/tzdata/Africa/Asmara | 5 + .../tcl/tcl8.6/tzdata/Africa/Asmera | 5 + .../tcl/tcl8.6/tzdata/Africa/Bamako | 5 + .../tcl/tcl8.6/tzdata/Africa/Bangui | 5 + .../tcl/tcl8.6/tzdata/Africa/Banjul | 5 + .../tcl/tcl8.6/tzdata/Africa/Bissau | 7 + .../tcl/tcl8.6/tzdata/Africa/Blantyre | 5 + .../tcl/tcl8.6/tzdata/Africa/Brazzaville | 5 + .../tcl/tcl8.6/tzdata/Africa/Bujumbura | 5 + .../tcl/tcl8.6/tzdata/Africa/Cairo | 132 + .../tcl/tcl8.6/tzdata/Africa/Casablanca | 230 + .../tcl/tcl8.6/tzdata/Africa/Ceuta | 258 + .../tcl/tcl8.6/tzdata/Africa/Conakry | 5 + .../tcl/tcl8.6/tzdata/Africa/Dakar | 5 + .../tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam | 5 + .../tcl/tcl8.6/tzdata/Africa/Djibouti | 5 + .../tcl/tcl8.6/tzdata/Africa/Douala | 5 + .../tcl/tcl8.6/tzdata/Africa/El_Aaiun | 219 + .../tcl/tcl8.6/tzdata/Africa/Freetown | 5 + .../tcl/tcl8.6/tzdata/Africa/Gaborone | 5 + .../tcl/tcl8.6/tzdata/Africa/Harare | 5 + .../tcl/tcl8.6/tzdata/Africa/Johannesburg | 11 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Juba | 5 + .../tcl/tcl8.6/tzdata/Africa/Kampala | 5 + .../tcl/tcl8.6/tzdata/Africa/Khartoum | 39 + .../tcl/tcl8.6/tzdata/Africa/Kigali | 5 + .../tcl/tcl8.6/tzdata/Africa/Kinshasa | 5 + .../tcl/tcl8.6/tzdata/Africa/Lagos | 6 + .../tcl/tcl8.6/tzdata/Africa/Libreville | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Lome | 5 + .../tcl/tcl8.6/tzdata/Africa/Luanda | 5 + .../tcl/tcl8.6/tzdata/Africa/Lubumbashi | 5 + .../tcl/tcl8.6/tzdata/Africa/Lusaka | 5 + .../tcl/tcl8.6/tzdata/Africa/Malabo | 5 + .../tcl/tcl8.6/tzdata/Africa/Maputo | 6 + .../tcl/tcl8.6/tzdata/Africa/Maseru | 5 + .../tcl/tcl8.6/tzdata/Africa/Mbabane | 5 + .../tcl/tcl8.6/tzdata/Africa/Mogadishu | 5 + .../tcl/tcl8.6/tzdata/Africa/Monrovia | 8 + .../tcl/tcl8.6/tzdata/Africa/Nairobi | 9 + .../tcl/tcl8.6/tzdata/Africa/Ndjamena | 8 + .../tcl/tcl8.6/tzdata/Africa/Niamey | 5 + .../tcl/tcl8.6/tzdata/Africa/Nouakchott | 5 + .../tcl/tcl8.6/tzdata/Africa/Ouagadougou | 5 + .../tcl/tcl8.6/tzdata/Africa/Porto-Novo | 5 + .../tcl/tcl8.6/tzdata/Africa/Sao_Tome | 5 + .../tcl/tcl8.6/tzdata/Africa/Timbuktu | 5 + .../tcl/tcl8.6/tzdata/Africa/Tripoli | 34 + .../tcl/tcl8.6/tzdata/Africa/Tunis | 39 + .../tcl/tcl8.6/tzdata/Africa/Windhoek | 222 + .../tcl/tcl8.6/tzdata/America/Adak | 276 + .../tcl/tcl8.6/tzdata/America/Anchorage | 276 + .../tcl/tcl8.6/tzdata/America/Anguilla | 5 + .../tcl/tcl8.6/tzdata/America/Antigua | 5 + .../tcl/tcl8.6/tzdata/America/Araguaina | 60 + .../tzdata/America/Argentina/Buenos_Aires | 67 + .../tcl8.6/tzdata/America/Argentina/Catamarca | 68 + .../tzdata/America/Argentina/ComodRivadavia | 5 + .../tcl8.6/tzdata/America/Argentina/Cordoba | 67 + .../tcl/tcl8.6/tzdata/America/Argentina/Jujuy | 67 + .../tcl8.6/tzdata/America/Argentina/La_Rioja | 69 + .../tcl8.6/tzdata/America/Argentina/Mendoza | 68 + .../tzdata/America/Argentina/Rio_Gallegos | 68 + .../tcl/tcl8.6/tzdata/America/Argentina/Salta | 66 + .../tcl8.6/tzdata/America/Argentina/San_Juan | 69 + .../tcl8.6/tzdata/America/Argentina/San_Luis | 68 + .../tcl8.6/tzdata/America/Argentina/Tucuman | 69 + .../tcl8.6/tzdata/America/Argentina/Ushuaia | 68 + .../tcl/tcl8.6/tzdata/America/Aruba | 5 + .../tcl/tcl8.6/tzdata/America/Asuncion | 259 + .../tcl/tcl8.6/tzdata/America/Atikokan | 12 + .../tcl/tcl8.6/tzdata/America/Atka | 5 + .../tcl/tcl8.6/tzdata/America/Bahia | 68 + .../tcl/tcl8.6/tzdata/America/Bahia_Banderas | 222 + .../tcl/tcl8.6/tzdata/America/Barbados | 15 + .../tcl/tcl8.6/tzdata/America/Belem | 35 + .../tcl/tcl8.6/tzdata/America/Belize | 60 + .../tcl/tcl8.6/tzdata/America/Blanc-Sablon | 12 + .../tcl/tcl8.6/tzdata/America/Boa_Vista | 40 + .../tcl/tcl8.6/tzdata/America/Bogota | 9 + .../tcl/tcl8.6/tzdata/America/Boise | 281 + .../tcl/tcl8.6/tzdata/America/Buenos_Aires | 5 + .../tcl/tcl8.6/tzdata/America/Cambridge_Bay | 252 + .../tcl/tcl8.6/tzdata/America/Campo_Grande | 257 + .../tcl/tcl8.6/tzdata/America/Cancun | 47 + .../tcl/tcl8.6/tzdata/America/Caracas | 10 + .../tcl/tcl8.6/tzdata/America/Catamarca | 5 + .../tcl/tcl8.6/tzdata/America/Cayenne | 7 + .../tcl/tcl8.6/tzdata/America/Cayman | 5 + .../tcl/tcl8.6/tzdata/America/Chicago | 369 + .../tcl/tcl8.6/tzdata/America/Chihuahua | 221 + .../tcl/tcl8.6/tzdata/America/Coral_Harbour | 5 + .../tcl/tcl8.6/tzdata/America/Cordoba | 5 + .../tcl/tcl8.6/tzdata/America/Costa_Rica | 15 + .../tcl/tcl8.6/tzdata/America/Creston | 8 + .../tcl/tcl8.6/tzdata/America/Cuiaba | 257 + .../tcl/tcl8.6/tzdata/America/Curacao | 7 + .../tcl/tcl8.6/tzdata/America/Danmarkshavn | 39 + .../tcl/tcl8.6/tzdata/America/Dawson | 256 + .../tcl/tcl8.6/tzdata/America/Dawson_Creek | 64 + .../tcl/tcl8.6/tzdata/America/Denver | 291 + .../tcl/tcl8.6/tzdata/America/Detroit | 272 + .../tcl/tcl8.6/tzdata/America/Dominica | 5 + .../tcl/tcl8.6/tzdata/America/Edmonton | 284 + .../tcl/tcl8.6/tzdata/America/Eirunepe | 41 + .../tcl/tcl8.6/tzdata/America/El_Salvador | 10 + .../tcl/tcl8.6/tzdata/America/Ensenada | 5 + .../tcl/tcl8.6/tzdata/America/Fort_Nelson | 151 + .../tcl/tcl8.6/tzdata/America/Fort_Wayne | 5 + .../tcl/tcl8.6/tzdata/America/Fortaleza | 48 + .../tcl/tcl8.6/tzdata/America/Glace_Bay | 273 + .../tcl/tcl8.6/tzdata/America/Godthab | 246 + .../tcl/tcl8.6/tzdata/America/Goose_Bay | 338 + .../tcl/tcl8.6/tzdata/America/Grand_Turk | 82 + .../tcl/tcl8.6/tzdata/America/Grenada | 5 + .../tcl/tcl8.6/tzdata/America/Guadeloupe | 5 + .../tcl/tcl8.6/tzdata/America/Guatemala | 14 + .../tcl/tcl8.6/tzdata/America/Guayaquil | 7 + .../tcl/tcl8.6/tzdata/America/Guyana | 9 + .../tcl/tcl8.6/tzdata/America/Halifax | 361 + .../tcl/tcl8.6/tzdata/America/Havana | 285 + .../tcl/tcl8.6/tzdata/America/Hermosillo | 21 + .../tzdata/America/Indiana/Indianapolis | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Knox | 285 + .../tcl/tcl8.6/tzdata/America/Indiana/Marengo | 236 + .../tcl8.6/tzdata/America/Indiana/Petersburg | 247 + .../tcl8.6/tzdata/America/Indiana/Tell_City | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Vevay | 213 + .../tcl8.6/tzdata/America/Indiana/Vincennes | 234 + .../tcl/tcl8.6/tzdata/America/Indiana/Winamac | 240 + .../tcl/tcl8.6/tzdata/America/Indianapolis | 5 + .../tcl/tcl8.6/tzdata/America/Inuvik | 249 + .../tcl/tcl8.6/tzdata/America/Iqaluit | 250 + .../tcl/tcl8.6/tzdata/America/Jamaica | 29 + .../tcl/tcl8.6/tzdata/America/Jujuy | 5 + .../tcl/tcl8.6/tzdata/America/Juneau | 276 + .../tcl8.6/tzdata/America/Kentucky/Louisville | 314 + .../tcl8.6/tzdata/America/Kentucky/Monticello | 279 + .../tcl/tcl8.6/tzdata/America/Knox_IN | 5 + .../tcl/tcl8.6/tzdata/America/Kralendijk | 5 + .../tcl/tcl8.6/tzdata/America/La_Paz | 8 + .../tcl/tcl8.6/tzdata/America/Lima | 16 + .../tcl/tcl8.6/tzdata/America/Los_Angeles | 317 + .../tcl/tcl8.6/tzdata/America/Louisville | 5 + .../tcl/tcl8.6/tzdata/America/Lower_Princes | 5 + .../tcl/tcl8.6/tzdata/America/Maceio | 52 + .../tcl/tcl8.6/tzdata/America/Managua | 21 + .../tcl/tcl8.6/tzdata/America/Manaus | 39 + .../tcl/tcl8.6/tzdata/America/Marigot | 5 + .../tcl/tcl8.6/tzdata/America/Martinique | 9 + .../tcl/tcl8.6/tzdata/America/Matamoros | 219 + .../tcl/tcl8.6/tzdata/America/Mazatlan | 222 + .../tcl/tcl8.6/tzdata/America/Mendoza | 5 + .../tcl/tcl8.6/tzdata/America/Menominee | 274 + .../tcl/tcl8.6/tzdata/America/Merida | 216 + .../tcl/tcl8.6/tzdata/America/Metlakatla | 212 + .../tcl/tcl8.6/tzdata/America/Mexico_City | 228 + .../tcl/tcl8.6/tzdata/America/Miquelon | 234 + .../tcl/tcl8.6/tzdata/America/Moncton | 342 + .../tcl/tcl8.6/tzdata/America/Monterrey | 218 + .../tcl/tcl8.6/tzdata/America/Montevideo | 92 + .../tcl/tcl8.6/tzdata/America/Montreal | 5 + .../tcl/tcl8.6/tzdata/America/Montserrat | 5 + .../tcl/tcl8.6/tzdata/America/Nassau | 279 + .../tcl/tcl8.6/tzdata/America/New_York | 369 + .../tcl/tcl8.6/tzdata/America/Nipigon | 264 + .../tcl/tcl8.6/tzdata/America/Nome | 276 + .../tcl/tcl8.6/tzdata/America/Noronha | 48 + .../tcl8.6/tzdata/America/North_Dakota/Beulah | 279 + .../tcl8.6/tzdata/America/North_Dakota/Center | 279 + .../tzdata/America/North_Dakota/New_Salem | 279 + .../tcl/tcl8.6/tzdata/America/Ojinaga | 222 + .../tcl/tcl8.6/tzdata/America/Panama | 7 + .../tcl/tcl8.6/tzdata/America/Pangnirtung | 252 + .../tcl/tcl8.6/tzdata/America/Paramaribo | 10 + .../tcl/tcl8.6/tzdata/America/Phoenix | 17 + .../tcl/tcl8.6/tzdata/America/Port-au-Prince | 49 + .../tcl/tcl8.6/tzdata/America/Port_of_Spain | 6 + .../tcl/tcl8.6/tzdata/America/Porto_Acre | 5 + .../tcl/tcl8.6/tzdata/America/Porto_Velho | 35 + .../tcl/tcl8.6/tzdata/America/Puerto_Rico | 10 + .../tcl/tcl8.6/tzdata/America/Rainy_River | 264 + .../tcl/tcl8.6/tzdata/America/Rankin_Inlet | 248 + .../tcl/tcl8.6/tzdata/America/Recife | 48 + .../tcl/tcl8.6/tzdata/America/Regina | 58 + .../tcl/tcl8.6/tzdata/America/Resolute | 248 + .../tcl/tcl8.6/tzdata/America/Rio_Branco | 37 + .../tcl/tcl8.6/tzdata/America/Rosario | 5 + .../tcl/tcl8.6/tzdata/America/Santa_Isabel | 5 + .../tcl/tcl8.6/tzdata/America/Santarem | 36 + .../tcl/tcl8.6/tzdata/America/Santiago | 289 + .../tcl/tcl8.6/tzdata/America/Santo_Domingo | 21 + .../tcl/tcl8.6/tzdata/America/Sao_Paulo | 258 + .../tcl/tcl8.6/tzdata/America/Scoresbysund | 246 + .../tcl/tcl8.6/tzdata/America/Shiprock | 5 + .../tcl/tcl8.6/tzdata/America/Sitka | 275 + .../tcl/tcl8.6/tzdata/America/St_Barthelemy | 5 + .../tcl/tcl8.6/tzdata/America/St_Johns | 372 + .../tcl/tcl8.6/tzdata/America/St_Kitts | 5 + .../tcl/tcl8.6/tzdata/America/St_Lucia | 5 + .../tcl/tcl8.6/tzdata/America/St_Thomas | 5 + .../tcl/tcl8.6/tzdata/America/St_Vincent | 5 + .../tcl/tcl8.6/tzdata/America/Swift_Current | 29 + .../tcl/tcl8.6/tzdata/America/Tegucigalpa | 12 + .../tcl/tcl8.6/tzdata/America/Thule | 224 + .../tcl/tcl8.6/tzdata/America/Thunder_Bay | 272 + .../tcl/tcl8.6/tzdata/America/Tijuana | 285 + .../tcl/tcl8.6/tzdata/America/Toronto | 365 + .../tcl/tcl8.6/tzdata/America/Tortola | 5 + .../tcl/tcl8.6/tzdata/America/Vancouver | 320 + .../tcl/tcl8.6/tzdata/America/Virgin | 5 + .../tcl/tcl8.6/tzdata/America/Whitehorse | 256 + .../tcl/tcl8.6/tzdata/America/Winnipeg | 316 + .../tcl/tcl8.6/tzdata/America/Yakutat | 276 + .../tcl/tcl8.6/tzdata/America/Yellowknife | 252 + .../tcl/tcl8.6/tzdata/Antarctica/Casey | 10 + .../tcl/tcl8.6/tzdata/Antarctica/Davis | 12 + .../tcl8.6/tzdata/Antarctica/DumontDUrville | 8 + .../tcl/tcl8.6/tzdata/Antarctica/Macquarie | 97 + .../tcl/tcl8.6/tzdata/Antarctica/Mawson | 7 + .../tcl/tcl8.6/tzdata/Antarctica/McMurdo | 5 + .../tcl/tcl8.6/tzdata/Antarctica/Palmer | 252 + .../tcl/tcl8.6/tzdata/Antarctica/Rothera | 6 + .../tcl/tcl8.6/tzdata/Antarctica/South_Pole | 5 + .../tcl/tcl8.6/tzdata/Antarctica/Syowa | 6 + .../tcl/tcl8.6/tzdata/Antarctica/Troll | 196 + .../tcl/tcl8.6/tzdata/Antarctica/Vostok | 6 + .../tcl/tcl8.6/tzdata/Arctic/Longyearbyen | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aden | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Almaty | 57 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Amman | 246 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Anadyr | 72 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aqtau | 59 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aqtobe | 58 + .../tcl/tcl8.6/tzdata/Asia/Ashgabat | 31 + .../tcl/tcl8.6/tzdata/Asia/Ashkhabad | 5 + .../tcl/tcl8.6/tzdata/Asia/Baghdad | 59 + .../tcl/tcl8.6/tzdata/Asia/Bahrain | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Baku | 74 + .../tcl/tcl8.6/tzdata/Asia/Bangkok | 7 + .../tcl/tcl8.6/tzdata/Asia/Barnaul | 73 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Beirut | 270 + .../tcl/tcl8.6/tzdata/Asia/Bishkek | 57 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Brunei | 7 + .../tcl/tcl8.6/tzdata/Asia/Calcutta | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Chita | 72 + .../tcl/tcl8.6/tzdata/Asia/Choibalsan | 222 + .../tcl/tcl8.6/tzdata/Asia/Chongqing | 5 + .../tcl/tcl8.6/tzdata/Asia/Chungking | 5 + .../tcl/tcl8.6/tzdata/Asia/Colombo | 13 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dacca | 5 + .../tcl/tcl8.6/tzdata/Asia/Damascus | 280 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dhaka | 14 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dili | 10 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dubai | 6 + .../tcl/tcl8.6/tzdata/Asia/Dushanbe | 29 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Gaza | 278 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Harbin | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Hebron | 277 + .../tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh | 14 + .../tcl/tcl8.6/tzdata/Asia/Hong_Kong | 75 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Hovd | 221 + .../tcl/tcl8.6/tzdata/Asia/Irkutsk | 72 + .../tcl/tcl8.6/tzdata/Asia/Istanbul | 5 + .../tcl/tcl8.6/tzdata/Asia/Jakarta | 13 + .../tcl/tcl8.6/tzdata/Asia/Jayapura | 8 + .../tcl/tcl8.6/tzdata/Asia/Jerusalem | 272 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kabul | 7 + .../tcl/tcl8.6/tzdata/Asia/Kamchatka | 71 + .../tcl/tcl8.6/tzdata/Asia/Karachi | 16 + .../tcl/tcl8.6/tzdata/Asia/Kashgar | 5 + .../tcl/tcl8.6/tzdata/Asia/Kathmandu | 7 + .../tcl/tcl8.6/tzdata/Asia/Katmandu | 5 + .../tcl/tcl8.6/tzdata/Asia/Khandyga | 73 + .../tcl/tcl8.6/tzdata/Asia/Kolkata | 10 + .../tcl/tcl8.6/tzdata/Asia/Krasnoyarsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur | 13 + .../tcl/tcl8.6/tzdata/Asia/Kuching | 24 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kuwait | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Macao | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Macau | 46 + .../tcl/tcl8.6/tzdata/Asia/Magadan | 72 + .../tcl/tcl8.6/tzdata/Asia/Makassar | 9 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Manila | 15 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Muscat | 5 + .../tcl/tcl8.6/tzdata/Asia/Nicosia | 257 + .../tcl/tcl8.6/tzdata/Asia/Novokuznetsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Novosibirsk | 73 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Omsk | 71 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Oral | 58 + .../tcl/tcl8.6/tzdata/Asia/Phnom_Penh | 5 + .../tcl/tcl8.6/tzdata/Asia/Pontianak | 13 + .../tcl/tcl8.6/tzdata/Asia/Pyongyang | 10 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Qatar | 7 + .../tcl/tcl8.6/tzdata/Asia/Qyzylorda | 57 + .../tcl/tcl8.6/tzdata/Asia/Rangoon | 9 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Riyadh | 6 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Saigon | 5 + .../tcl/tcl8.6/tzdata/Asia/Sakhalin | 74 + .../tcl/tcl8.6/tzdata/Asia/Samarkand | 32 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Seoul | 27 + .../tcl/tcl8.6/tzdata/Asia/Shanghai | 23 + .../tcl/tcl8.6/tzdata/Asia/Singapore | 14 + .../tcl/tcl8.6/tzdata/Asia/Srednekolymsk | 71 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Taipei | 46 + .../tcl/tcl8.6/tzdata/Asia/Tashkent | 32 + .../tcl/tcl8.6/tzdata/Asia/Tbilisi | 60 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tehran | 229 + .../tcl/tcl8.6/tzdata/Asia/Tel_Aviv | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Thimbu | 5 + .../tcl/tcl8.6/tzdata/Asia/Thimphu | 7 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tokyo | 16 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tomsk | 73 + .../tcl/tcl8.6/tzdata/Asia/Ujung_Pandang | 5 + .../tcl/tcl8.6/tzdata/Asia/Ulaanbaatar | 221 + .../tcl/tcl8.6/tzdata/Asia/Ulan_Bator | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Urumqi | 6 + .../tcl/tcl8.6/tzdata/Asia/Ust-Nera | 71 + .../tcl/tcl8.6/tzdata/Asia/Vientiane | 5 + .../tcl/tcl8.6/tzdata/Asia/Vladivostok | 71 + .../tcl/tcl8.6/tzdata/Asia/Yakutsk | 71 + .../tcl/tcl8.6/tzdata/Asia/Yekaterinburg | 72 + .../tcl/tcl8.6/tzdata/Asia/Yerevan | 70 + .../tcl/tcl8.6/tzdata/Atlantic/Azores | 349 + .../tcl/tcl8.6/tzdata/Atlantic/Bermuda | 259 + .../tcl/tcl8.6/tzdata/Atlantic/Canary | 247 + .../tcl/tcl8.6/tzdata/Atlantic/Cape_Verde | 9 + .../tcl/tcl8.6/tzdata/Atlantic/Faeroe | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Faroe | 245 + .../tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Madeira | 350 + .../tcl/tcl8.6/tzdata/Atlantic/Reykjavik | 73 + .../tcl/tcl8.6/tzdata/Atlantic/South_Georgia | 6 + .../tcl/tcl8.6/tzdata/Atlantic/St_Helena | 5 + .../tcl/tcl8.6/tzdata/Atlantic/Stanley | 75 + .../tcl/tcl8.6/tzdata/Australia/ACT | 5 + .../tcl/tcl8.6/tzdata/Australia/Adelaide | 273 + .../tcl/tcl8.6/tzdata/Australia/Brisbane | 23 + .../tcl/tcl8.6/tzdata/Australia/Broken_Hill | 275 + .../tcl/tcl8.6/tzdata/Australia/Canberra | 5 + .../tcl/tcl8.6/tzdata/Australia/Currie | 273 + .../tcl/tcl8.6/tzdata/Australia/Darwin | 15 + .../tcl/tcl8.6/tzdata/Australia/Eucla | 25 + .../tcl/tcl8.6/tzdata/Australia/Hobart | 281 + .../tcl/tcl8.6/tzdata/Australia/LHI | 5 + .../tcl/tcl8.6/tzdata/Australia/Lindeman | 28 + .../tcl/tcl8.6/tzdata/Australia/Lord_Howe | 244 + .../tcl/tcl8.6/tzdata/Australia/Melbourne | 272 + .../tcl/tcl8.6/tzdata/Australia/NSW | 5 + .../tcl/tcl8.6/tzdata/Australia/North | 5 + .../tcl/tcl8.6/tzdata/Australia/Perth | 25 + .../tcl/tcl8.6/tzdata/Australia/Queensland | 5 + .../tcl/tcl8.6/tzdata/Australia/South | 5 + .../tcl/tcl8.6/tzdata/Australia/Sydney | 272 + .../tcl/tcl8.6/tzdata/Australia/Tasmania | 5 + .../tcl/tcl8.6/tzdata/Australia/Victoria | 5 + .../tcl/tcl8.6/tzdata/Australia/West | 5 + .../tcl/tcl8.6/tzdata/Australia/Yancowinna | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/Acre | 5 + .../tcl/tcl8.6/tzdata/Brazil/DeNoronha | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/East | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/West | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/CET | 265 + .../FlaskWebenv/tcl/tcl8.6/tzdata/CST6CDT | 278 + .../tcl/tcl8.6/tzdata/Canada/Atlantic | 5 + .../tcl/tcl8.6/tzdata/Canada/Central | 5 + .../tcl8.6/tzdata/Canada/East-Saskatchewan | 5 + .../tcl/tcl8.6/tzdata/Canada/Eastern | 5 + .../tcl/tcl8.6/tzdata/Canada/Mountain | 5 + .../tcl/tcl8.6/tzdata/Canada/Newfoundland | 5 + .../tcl/tcl8.6/tzdata/Canada/Pacific | 5 + .../tcl/tcl8.6/tzdata/Canada/Saskatchewan | 5 + .../tcl/tcl8.6/tzdata/Canada/Yukon | 5 + .../tcl/tcl8.6/tzdata/Chile/Continental | 5 + .../tcl/tcl8.6/tzdata/Chile/EasterIsland | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Cuba | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/EET | 251 + .../FlaskWebenv/tcl/tcl8.6/tzdata/EST | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/EST5EDT | 278 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Egypt | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Eire | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+0 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+1 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+10 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+11 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+12 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+2 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+3 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+4 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+5 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+6 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+7 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+8 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+9 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-0 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-1 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-10 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-11 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-12 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-13 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-14 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-2 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-3 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-4 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-5 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-6 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-7 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-8 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-9 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT0 | 5 + .../tcl/tcl8.6/tzdata/Etc/Greenwich | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/UCT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/UTC | 5 + .../tcl/tcl8.6/tzdata/Etc/Universal | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Etc/Zulu | 5 + .../tcl/tcl8.6/tzdata/Europe/Amsterdam | 310 + .../tcl/tcl8.6/tzdata/Europe/Andorra | 237 + .../tcl/tcl8.6/tzdata/Europe/Astrakhan | 71 + .../tcl/tcl8.6/tzdata/Europe/Athens | 268 + .../tcl/tcl8.6/tzdata/Europe/Belfast | 5 + .../tcl/tcl8.6/tzdata/Europe/Belgrade | 250 + .../tcl/tcl8.6/tzdata/Europe/Berlin | 274 + .../tcl/tcl8.6/tzdata/Europe/Bratislava | 5 + .../tcl/tcl8.6/tzdata/Europe/Brussels | 316 + .../tcl/tcl8.6/tzdata/Europe/Bucharest | 268 + .../tcl/tcl8.6/tzdata/Europe/Budapest | 282 + .../tcl/tcl8.6/tzdata/Europe/Busingen | 5 + .../tcl/tcl8.6/tzdata/Europe/Chisinau | 272 + .../tcl/tcl8.6/tzdata/Europe/Copenhagen | 264 + .../tcl/tcl8.6/tzdata/Europe/Dublin | 359 + .../tcl/tcl8.6/tzdata/Europe/Gibraltar | 328 + .../tcl/tcl8.6/tzdata/Europe/Guernsey | 5 + .../tcl/tcl8.6/tzdata/Europe/Helsinki | 248 + .../tcl/tcl8.6/tzdata/Europe/Isle_of_Man | 5 + .../tcl/tcl8.6/tzdata/Europe/Istanbul | 306 + .../tcl/tcl8.6/tzdata/Europe/Jersey | 5 + .../tcl/tcl8.6/tzdata/Europe/Kaliningrad | 85 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Kiev | 251 + .../tcl/tcl8.6/tzdata/Europe/Kirov | 70 + .../tcl/tcl8.6/tzdata/Europe/Lisbon | 351 + .../tcl/tcl8.6/tzdata/Europe/Ljubljana | 5 + .../tcl/tcl8.6/tzdata/Europe/London | 372 + .../tcl/tcl8.6/tzdata/Europe/Luxembourg | 313 + .../tcl/tcl8.6/tzdata/Europe/Madrid | 294 + .../tcl/tcl8.6/tzdata/Europe/Malta | 299 + .../tcl/tcl8.6/tzdata/Europe/Mariehamn | 5 + .../tcl/tcl8.6/tzdata/Europe/Minsk | 76 + .../tcl/tcl8.6/tzdata/Europe/Monaco | 315 + .../tcl/tcl8.6/tzdata/Europe/Moscow | 83 + .../tcl/tcl8.6/tzdata/Europe/Nicosia | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Oslo | 271 + .../tcl/tcl8.6/tzdata/Europe/Paris | 314 + .../tcl/tcl8.6/tzdata/Europe/Podgorica | 5 + .../tcl/tcl8.6/tzdata/Europe/Prague | 272 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Riga | 258 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Rome | 301 + .../tcl/tcl8.6/tzdata/Europe/Samara | 73 + .../tcl/tcl8.6/tzdata/Europe/San_Marino | 5 + .../tcl/tcl8.6/tzdata/Europe/Sarajevo | 5 + .../tcl/tcl8.6/tzdata/Europe/Simferopol | 82 + .../tcl/tcl8.6/tzdata/Europe/Skopje | 5 + .../tcl/tcl8.6/tzdata/Europe/Sofia | 258 + .../tcl/tcl8.6/tzdata/Europe/Stockholm | 250 + .../tcl/tcl8.6/tzdata/Europe/Tallinn | 254 + .../tcl/tcl8.6/tzdata/Europe/Tirane | 263 + .../tcl/tcl8.6/tzdata/Europe/Tiraspol | 5 + .../tcl/tcl8.6/tzdata/Europe/Ulyanovsk | 73 + .../tcl/tcl8.6/tzdata/Europe/Uzhgorod | 254 + .../tcl/tcl8.6/tzdata/Europe/Vaduz | 5 + .../tcl/tcl8.6/tzdata/Europe/Vatican | 5 + .../tcl/tcl8.6/tzdata/Europe/Vienna | 271 + .../tcl/tcl8.6/tzdata/Europe/Vilnius | 252 + .../tcl/tcl8.6/tzdata/Europe/Volgograd | 72 + .../tcl/tcl8.6/tzdata/Europe/Warsaw | 296 + .../tcl/tcl8.6/tzdata/Europe/Zagreb | 5 + .../tcl/tcl8.6/tzdata/Europe/Zaporozhye | 252 + .../tcl/tcl8.6/tzdata/Europe/Zurich | 250 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GB | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GB-Eire | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GMT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GMT+0 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GMT-0 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/GMT0 | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Greenwich | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/HST | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Hongkong | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Iceland | 5 + .../tcl/tcl8.6/tzdata/Indian/Antananarivo | 5 + .../tcl/tcl8.6/tzdata/Indian/Chagos | 7 + .../tcl/tcl8.6/tzdata/Indian/Christmas | 6 + .../tcl/tcl8.6/tzdata/Indian/Cocos | 6 + .../tcl/tcl8.6/tzdata/Indian/Comoro | 5 + .../tcl/tcl8.6/tzdata/Indian/Kerguelen | 6 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Mahe | 6 + .../tcl/tcl8.6/tzdata/Indian/Maldives | 7 + .../tcl/tcl8.6/tzdata/Indian/Mauritius | 10 + .../tcl/tcl8.6/tzdata/Indian/Mayotte | 5 + .../tcl/tcl8.6/tzdata/Indian/Reunion | 6 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Iran | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Israel | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Jamaica | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Japan | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Kwajalein | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Libya | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/MET | 265 + .../FlaskWebenv/tcl/tcl8.6/tzdata/MST | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/MST7MDT | 278 + .../tcl/tcl8.6/tzdata/Mexico/BajaNorte | 5 + .../tcl/tcl8.6/tzdata/Mexico/BajaSur | 5 + .../tcl/tcl8.6/tzdata/Mexico/General | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/NZ | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/NZ-CHAT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Navajo | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/PRC | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/PST8PDT | 278 + .../tcl/tcl8.6/tzdata/Pacific/Apia | 188 + .../tcl/tcl8.6/tzdata/Pacific/Auckland | 285 + .../tcl/tcl8.6/tzdata/Pacific/Bougainville | 10 + .../tcl/tcl8.6/tzdata/Pacific/Chatham | 258 + .../tcl/tcl8.6/tzdata/Pacific/Chuuk | 6 + .../tcl/tcl8.6/tzdata/Pacific/Easter | 268 + .../tcl/tcl8.6/tzdata/Pacific/Efate | 26 + .../tcl/tcl8.6/tzdata/Pacific/Enderbury | 8 + .../tcl/tcl8.6/tzdata/Pacific/Fakaofo | 7 + .../tcl/tcl8.6/tzdata/Pacific/Fiji | 191 + .../tcl/tcl8.6/tzdata/Pacific/Funafuti | 6 + .../tcl/tcl8.6/tzdata/Pacific/Galapagos | 7 + .../tcl/tcl8.6/tzdata/Pacific/Gambier | 6 + .../tcl/tcl8.6/tzdata/Pacific/Guadalcanal | 6 + .../tcl/tcl8.6/tzdata/Pacific/Guam | 8 + .../tcl/tcl8.6/tzdata/Pacific/Honolulu | 11 + .../tcl/tcl8.6/tzdata/Pacific/Johnston | 5 + .../tcl/tcl8.6/tzdata/Pacific/Kiritimati | 8 + .../tcl/tcl8.6/tzdata/Pacific/Kosrae | 8 + .../tcl/tcl8.6/tzdata/Pacific/Kwajalein | 8 + .../tcl/tcl8.6/tzdata/Pacific/Majuro | 7 + .../tcl/tcl8.6/tzdata/Pacific/Marquesas | 6 + .../tcl/tcl8.6/tzdata/Pacific/Midway | 5 + .../tcl/tcl8.6/tzdata/Pacific/Nauru | 9 + .../tcl/tcl8.6/tzdata/Pacific/Niue | 8 + .../tcl/tcl8.6/tzdata/Pacific/Norfolk | 10 + .../tcl/tcl8.6/tzdata/Pacific/Noumea | 12 + .../tcl/tcl8.6/tzdata/Pacific/Pago_Pago | 9 + .../tcl/tcl8.6/tzdata/Pacific/Palau | 6 + .../tcl/tcl8.6/tzdata/Pacific/Pitcairn | 7 + .../tcl/tcl8.6/tzdata/Pacific/Pohnpei | 6 + .../tcl/tcl8.6/tzdata/Pacific/Ponape | 5 + .../tcl/tcl8.6/tzdata/Pacific/Port_Moresby | 7 + .../tcl/tcl8.6/tzdata/Pacific/Rarotonga | 32 + .../tcl/tcl8.6/tzdata/Pacific/Saipan | 5 + .../tcl/tcl8.6/tzdata/Pacific/Samoa | 5 + .../tcl/tcl8.6/tzdata/Pacific/Tahiti | 6 + .../tcl/tcl8.6/tzdata/Pacific/Tarawa | 6 + .../tcl/tcl8.6/tzdata/Pacific/Tongatapu | 14 + .../tcl/tcl8.6/tzdata/Pacific/Truk | 5 + .../tcl/tcl8.6/tzdata/Pacific/Wake | 6 + .../tcl/tcl8.6/tzdata/Pacific/Wallis | 6 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Yap | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Poland | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Portugal | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/ROC | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/ROK | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Singapore | 5 + .../tcl/tcl8.6/tzdata/SystemV/AST4 | 5 + .../tcl/tcl8.6/tzdata/SystemV/AST4ADT | 5 + .../tcl/tcl8.6/tzdata/SystemV/CST6 | 5 + .../tcl/tcl8.6/tzdata/SystemV/CST6CDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/EST5 | 5 + .../tcl/tcl8.6/tzdata/SystemV/EST5EDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/HST10 | 5 + .../tcl/tcl8.6/tzdata/SystemV/MST7 | 5 + .../tcl/tcl8.6/tzdata/SystemV/MST7MDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/PST8 | 5 + .../tcl/tcl8.6/tzdata/SystemV/PST8PDT | 5 + .../tcl/tcl8.6/tzdata/SystemV/YST9 | 5 + .../tcl/tcl8.6/tzdata/SystemV/YST9YDT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Turkey | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/UCT | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Alaska | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Aleutian | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Arizona | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Central | 5 + .../tcl/tcl8.6/tzdata/US/East-Indiana | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Eastern | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Hawaii | 5 + .../tcl/tcl8.6/tzdata/US/Indiana-Starke | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Michigan | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Mountain | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Pacific | 5 + .../tcl/tcl8.6/tzdata/US/Pacific-New | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/US/Samoa | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/UTC | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Universal | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/W-SU | 5 + .../FlaskWebenv/tcl/tcl8.6/tzdata/WET | 251 + .../FlaskWebenv/tcl/tcl8.6/tzdata/Zulu | 5 + .../FlaskWebenv/tcl/tcl8.6/word.tcl | 152 + .../FlaskWebenv/tcl/tk8.6/bgerror.tcl | 265 + .../FlaskWebenv/tcl/tk8.6/button.tcl | 778 ++ .../FlaskWebenv/tcl/tk8.6/choosedir.tcl | 308 + .../FlaskWebenv/tcl/tk8.6/clrpick.tcl | 695 ++ .../FlaskWebenv/tcl/tk8.6/comdlg.tcl | 319 + .../FlaskWebenv/tcl/tk8.6/console.tcl | 1148 ++ .../FlaskWebenv/tcl/tk8.6/demos/README | 44 + .../FlaskWebenv/tcl/tk8.6/demos/anilabel.tcl | 160 + .../FlaskWebenv/tcl/tk8.6/demos/aniwave.tcl | 104 + .../FlaskWebenv/tcl/tk8.6/demos/arrow.tcl | 237 + .../FlaskWebenv/tcl/tk8.6/demos/bind.tcl | 78 + .../FlaskWebenv/tcl/tk8.6/demos/bitmap.tcl | 52 + .../FlaskWebenv/tcl/tk8.6/demos/browse | 66 + .../FlaskWebenv/tcl/tk8.6/demos/button.tcl | 47 + .../FlaskWebenv/tcl/tk8.6/demos/check.tcl | 71 + .../FlaskWebenv/tcl/tk8.6/demos/clrpick.tcl | 54 + .../FlaskWebenv/tcl/tk8.6/demos/colors.tcl | 99 + .../FlaskWebenv/tcl/tk8.6/demos/combo.tcl | 61 + .../FlaskWebenv/tcl/tk8.6/demos/cscroll.tcl | 108 + .../FlaskWebenv/tcl/tk8.6/demos/ctext.tcl | 172 + .../FlaskWebenv/tcl/tk8.6/demos/dialog1.tcl | 13 + .../FlaskWebenv/tcl/tk8.6/demos/dialog2.tcl | 17 + .../FlaskWebenv/tcl/tk8.6/demos/en.msg | 97 + .../FlaskWebenv/tcl/tk8.6/demos/entry1.tcl | 34 + .../FlaskWebenv/tcl/tk8.6/demos/entry2.tcl | 46 + .../FlaskWebenv/tcl/tk8.6/demos/entry3.tcl | 185 + .../FlaskWebenv/tcl/tk8.6/demos/filebox.tcl | 81 + .../tcl/tk8.6/demos/fontchoose.tcl | 69 + .../FlaskWebenv/tcl/tk8.6/demos/form.tcl | 38 + .../FlaskWebenv/tcl/tk8.6/demos/hello | 22 + .../FlaskWebenv/tcl/tk8.6/demos/hscale.tcl | 45 + .../FlaskWebenv/tcl/tk8.6/demos/icon.tcl | 51 + .../FlaskWebenv/tcl/tk8.6/demos/image1.tcl | 35 + .../FlaskWebenv/tcl/tk8.6/demos/image2.tcl | 108 + .../tcl/tk8.6/demos/images/earthris.gif | Bin 0 -> 6343 bytes .../tcl/tk8.6/demos/images/flagdown.xbm | 27 + .../tcl/tk8.6/demos/images/flagup.xbm | 27 + .../tcl/tk8.6/demos/images/gray25.xbm | 6 + .../tcl/tk8.6/demos/images/letters.xbm | 27 + .../tcl/tk8.6/demos/images/noletter.xbm | 27 + .../tcl/tk8.6/demos/images/pattern.xbm | 6 + .../tcl/tk8.6/demos/images/tcllogo.gif | Bin 0 -> 2341 bytes .../FlaskWebenv/tcl/tk8.6/demos/items.tcl | 291 + .../FlaskWebenv/tcl/tk8.6/demos/ixset | 328 + .../tcl/tk8.6/demos/knightstour.tcl | 268 + .../FlaskWebenv/tcl/tk8.6/demos/label.tcl | 40 + .../tcl/tk8.6/demos/labelframe.tcl | 76 + .../FlaskWebenv/tcl/tk8.6/demos/license.terms | 40 + .../FlaskWebenv/tcl/tk8.6/demos/mclist.tcl | 119 + .../FlaskWebenv/tcl/tk8.6/demos/menu.tcl | 161 + .../FlaskWebenv/tcl/tk8.6/demos/menubu.tcl | 90 + .../FlaskWebenv/tcl/tk8.6/demos/msgbox.tcl | 62 + .../FlaskWebenv/tcl/tk8.6/demos/nl.msg | 125 + .../FlaskWebenv/tcl/tk8.6/demos/paned1.tcl | 32 + .../FlaskWebenv/tcl/tk8.6/demos/paned2.tcl | 74 + .../FlaskWebenv/tcl/tk8.6/demos/pendulum.tcl | 197 + .../FlaskWebenv/tcl/tk8.6/demos/plot.tcl | 97 + .../FlaskWebenv/tcl/tk8.6/demos/puzzle.tcl | 82 + .../FlaskWebenv/tcl/tk8.6/demos/radio.tcl | 66 + .../FlaskWebenv/tcl/tk8.6/demos/rmt | 210 + .../FlaskWebenv/tcl/tk8.6/demos/rolodex | 204 + .../FlaskWebenv/tcl/tk8.6/demos/ruler.tcl | 171 + .../FlaskWebenv/tcl/tk8.6/demos/sayings.tcl | 44 + .../FlaskWebenv/tcl/tk8.6/demos/search.tcl | 139 + .../FlaskWebenv/tcl/tk8.6/demos/spin.tcl | 53 + .../FlaskWebenv/tcl/tk8.6/demos/square | 60 + .../FlaskWebenv/tcl/tk8.6/demos/states.tcl | 54 + .../FlaskWebenv/tcl/tk8.6/demos/style.tcl | 155 + .../FlaskWebenv/tcl/tk8.6/demos/tclIndex | 67 + .../FlaskWebenv/tcl/tk8.6/demos/tcolor | 358 + .../FlaskWebenv/tcl/tk8.6/demos/text.tcl | 111 + .../FlaskWebenv/tcl/tk8.6/demos/textpeer.tcl | 62 + .../FlaskWebenv/tcl/tk8.6/demos/timer | 47 + .../FlaskWebenv/tcl/tk8.6/demos/toolbar.tcl | 92 + .../FlaskWebenv/tcl/tk8.6/demos/tree.tcl | 88 + .../FlaskWebenv/tcl/tk8.6/demos/ttkbut.tcl | 84 + .../FlaskWebenv/tcl/tk8.6/demos/ttkmenu.tcl | 53 + .../FlaskWebenv/tcl/tk8.6/demos/ttknote.tcl | 57 + .../FlaskWebenv/tcl/tk8.6/demos/ttkpane.tcl | 112 + .../tcl/tk8.6/demos/ttkprogress.tcl | 46 + .../FlaskWebenv/tcl/tk8.6/demos/ttkscale.tcl | 39 + .../FlaskWebenv/tcl/tk8.6/demos/twind.tcl | 325 + .../tcl/tk8.6/demos/unicodeout.tcl | 137 + .../FlaskWebenv/tcl/tk8.6/demos/vscale.tcl | 46 + .../FlaskWebenv/tcl/tk8.6/demos/widget | 721 ++ .../FlaskWebenv/tcl/tk8.6/dialog.tcl | 180 + .../FlaskWebenv/tcl/tk8.6/entry.tcl | 654 ++ .../FlaskWebenv/tcl/tk8.6/focus.tcl | 178 + .../FlaskWebenv/tcl/tk8.6/fontchooser.tcl | 449 + .../FlaskWebenv/tcl/tk8.6/iconlist.tcl | 696 ++ .../FlaskWebenv/tcl/tk8.6/icons.tcl | 153 + .../FlaskWebenv/tcl/tk8.6/images/README | 7 + .../FlaskWebenv/tcl/tk8.6/images/logo.eps | 2091 ++++ .../FlaskWebenv/tcl/tk8.6/images/logo100.gif | Bin 0 -> 2341 bytes .../FlaskWebenv/tcl/tk8.6/images/logo64.gif | Bin 0 -> 1670 bytes .../tcl/tk8.6/images/logoLarge.gif | Bin 0 -> 11000 bytes .../FlaskWebenv/tcl/tk8.6/images/logoMed.gif | Bin 0 -> 3889 bytes .../FlaskWebenv/tcl/tk8.6/images/pwrdLogo.eps | 1897 ++++ .../tcl/tk8.6/images/pwrdLogo100.gif | Bin 0 -> 1615 bytes .../tcl/tk8.6/images/pwrdLogo150.gif | Bin 0 -> 2489 bytes .../tcl/tk8.6/images/pwrdLogo175.gif | Bin 0 -> 2981 bytes .../tcl/tk8.6/images/pwrdLogo200.gif | Bin 0 -> 3491 bytes .../tcl/tk8.6/images/pwrdLogo75.gif | Bin 0 -> 1171 bytes .../FlaskWebenv/tcl/tk8.6/images/tai-ku.gif | Bin 0 -> 5473 bytes .../FlaskWebenv/tcl/tk8.6/license.terms | 40 + .../FlaskWebenv/tcl/tk8.6/listbox.tcl | 552 + .../FlaskWebenv/tcl/tk8.6/megawidget.tcl | 297 + .../FlaskWebenv/tcl/tk8.6/menu.tcl | 1349 +++ .../FlaskWebenv/tcl/tk8.6/mkpsenc.tcl | 1488 +++ .../FlaskWebenv/tcl/tk8.6/msgbox.tcl | 429 + .../FlaskWebenv/tcl/tk8.6/msgs/cs.msg | 77 + .../FlaskWebenv/tcl/tk8.6/msgs/da.msg | 78 + .../FlaskWebenv/tcl/tk8.6/msgs/de.msg | 91 + .../FlaskWebenv/tcl/tk8.6/msgs/el.msg | 86 + .../FlaskWebenv/tcl/tk8.6/msgs/en.msg | 91 + .../FlaskWebenv/tcl/tk8.6/msgs/en_gb.msg | 3 + .../FlaskWebenv/tcl/tk8.6/msgs/eo.msg | 75 + .../FlaskWebenv/tcl/tk8.6/msgs/es.msg | 76 + .../FlaskWebenv/tcl/tk8.6/msgs/fr.msg | 72 + .../FlaskWebenv/tcl/tk8.6/msgs/hu.msg | 78 + .../FlaskWebenv/tcl/tk8.6/msgs/it.msg | 73 + .../FlaskWebenv/tcl/tk8.6/msgs/nl.msg | 91 + .../FlaskWebenv/tcl/tk8.6/msgs/pl.msg | 91 + .../FlaskWebenv/tcl/tk8.6/msgs/pt.msg | 74 + .../FlaskWebenv/tcl/tk8.6/msgs/ru.msg | 75 + .../FlaskWebenv/tcl/tk8.6/msgs/sv.msg | 76 + .../FlaskWebenv/tcl/tk8.6/obsolete.tcl | 178 + .../FlaskWebenv/tcl/tk8.6/optMenu.tcl | 43 + .../FlaskWebenv/tcl/tk8.6/palette.tcl | 244 + .../FlaskWebenv/tcl/tk8.6/panedwindow.tcl | 194 + .../FlaskWebenv/tcl/tk8.6/pkgIndex.tcl | 7 + .../FlaskWebenv/tcl/tk8.6/safetk.tcl | 262 + .../FlaskWebenv/tcl/tk8.6/scale.tcl | 290 + .../FlaskWebenv/tcl/tk8.6/scrlbar.tcl | 454 + .../FlaskWebenv/tcl/tk8.6/spinbox.tcl | 580 + .../FlaskWebenv/tcl/tk8.6/tclIndex | 253 + .../FlaskWebenv/tcl/tk8.6/tearoff.tcl | 180 + .../FlaskWebenv/tcl/tk8.6/text.tcl | 1204 ++ flaskwebproject/FlaskWebenv/tcl/tk8.6/tk.tcl | 694 ++ .../FlaskWebenv/tcl/tk8.6/tkfbox.tcl | 1237 +++ .../FlaskWebenv/tcl/tk8.6/ttk/altTheme.tcl | 101 + .../FlaskWebenv/tcl/tk8.6/ttk/aquaTheme.tcl | 59 + .../FlaskWebenv/tcl/tk8.6/ttk/button.tcl | 83 + .../FlaskWebenv/tcl/tk8.6/ttk/clamTheme.tcl | 137 + .../tcl/tk8.6/ttk/classicTheme.tcl | 108 + .../FlaskWebenv/tcl/tk8.6/ttk/combobox.tcl | 456 + .../FlaskWebenv/tcl/tk8.6/ttk/cursors.tcl | 186 + .../FlaskWebenv/tcl/tk8.6/ttk/defaults.tcl | 125 + .../FlaskWebenv/tcl/tk8.6/ttk/entry.tcl | 607 + .../FlaskWebenv/tcl/tk8.6/ttk/fonts.tcl | 157 + .../FlaskWebenv/tcl/tk8.6/ttk/menubutton.tcl | 169 + .../FlaskWebenv/tcl/tk8.6/ttk/notebook.tcl | 197 + .../FlaskWebenv/tcl/tk8.6/ttk/panedwindow.tcl | 82 + .../FlaskWebenv/tcl/tk8.6/ttk/progress.tcl | 49 + .../FlaskWebenv/tcl/tk8.6/ttk/scale.tcl | 94 + .../FlaskWebenv/tcl/tk8.6/ttk/scrollbar.tcl | 123 + .../FlaskWebenv/tcl/tk8.6/ttk/sizegrip.tcl | 102 + .../FlaskWebenv/tcl/tk8.6/ttk/spinbox.tcl | 173 + .../FlaskWebenv/tcl/tk8.6/ttk/treeview.tcl | 363 + .../FlaskWebenv/tcl/tk8.6/ttk/ttk.tcl | 176 + .../FlaskWebenv/tcl/tk8.6/ttk/utils.tcl | 350 + .../FlaskWebenv/tcl/tk8.6/ttk/vistaTheme.tcl | 224 + .../FlaskWebenv/tcl/tk8.6/ttk/winTheme.tcl | 80 + .../FlaskWebenv/tcl/tk8.6/ttk/xpTheme.tcl | 65 + .../FlaskWebenv/tcl/tk8.6/unsupported.tcl | 269 + .../FlaskWebenv/tcl/tk8.6/xmfbox.tcl | 988 ++ flaskwebproject/Lib/encodings/__init__.py | 169 + flaskwebproject/Lib/encodings/aliases.py | 550 + flaskwebproject/Lib/encodings/ascii.py | 50 + flaskwebproject/Lib/encodings/base64_codec.py | 55 + flaskwebproject/Lib/encodings/big5.py | 39 + flaskwebproject/Lib/encodings/big5hkscs.py | 39 + flaskwebproject/Lib/encodings/bz2_codec.py | 78 + flaskwebproject/Lib/encodings/charmap.py | 69 + flaskwebproject/Lib/encodings/cp037.py | 307 + flaskwebproject/Lib/encodings/cp1006.py | 307 + flaskwebproject/Lib/encodings/cp1026.py | 307 + flaskwebproject/Lib/encodings/cp1125.py | 698 ++ flaskwebproject/Lib/encodings/cp1140.py | 307 + flaskwebproject/Lib/encodings/cp1250.py | 307 + flaskwebproject/Lib/encodings/cp1251.py | 307 + flaskwebproject/Lib/encodings/cp1252.py | 307 + flaskwebproject/Lib/encodings/cp1253.py | 307 + flaskwebproject/Lib/encodings/cp1254.py | 307 + flaskwebproject/Lib/encodings/cp1255.py | 307 + flaskwebproject/Lib/encodings/cp1256.py | 307 + flaskwebproject/Lib/encodings/cp1257.py | 307 + flaskwebproject/Lib/encodings/cp1258.py | 307 + flaskwebproject/Lib/encodings/cp273.py | 307 + flaskwebproject/Lib/encodings/cp424.py | 307 + flaskwebproject/Lib/encodings/cp437.py | 698 ++ flaskwebproject/Lib/encodings/cp500.py | 307 + flaskwebproject/Lib/encodings/cp65001.py | 43 + flaskwebproject/Lib/encodings/cp720.py | 309 + flaskwebproject/Lib/encodings/cp737.py | 698 ++ flaskwebproject/Lib/encodings/cp775.py | 697 ++ flaskwebproject/Lib/encodings/cp850.py | 698 ++ flaskwebproject/Lib/encodings/cp852.py | 698 ++ flaskwebproject/Lib/encodings/cp855.py | 698 ++ flaskwebproject/Lib/encodings/cp856.py | 307 + flaskwebproject/Lib/encodings/cp857.py | 694 ++ flaskwebproject/Lib/encodings/cp858.py | 698 ++ flaskwebproject/Lib/encodings/cp860.py | 698 ++ flaskwebproject/Lib/encodings/cp861.py | 698 ++ flaskwebproject/Lib/encodings/cp862.py | 698 ++ flaskwebproject/Lib/encodings/cp863.py | 698 ++ flaskwebproject/Lib/encodings/cp864.py | 690 ++ flaskwebproject/Lib/encodings/cp865.py | 698 ++ flaskwebproject/Lib/encodings/cp866.py | 698 ++ flaskwebproject/Lib/encodings/cp869.py | 689 ++ flaskwebproject/Lib/encodings/cp874.py | 307 + flaskwebproject/Lib/encodings/cp875.py | 307 + flaskwebproject/Lib/encodings/cp932.py | 39 + flaskwebproject/Lib/encodings/cp949.py | 39 + flaskwebproject/Lib/encodings/cp950.py | 39 + flaskwebproject/Lib/encodings/euc_jis_2004.py | 39 + flaskwebproject/Lib/encodings/euc_jisx0213.py | 39 + flaskwebproject/Lib/encodings/euc_jp.py | 39 + flaskwebproject/Lib/encodings/euc_kr.py | 39 + flaskwebproject/Lib/encodings/gb18030.py | 39 + flaskwebproject/Lib/encodings/gb2312.py | 39 + flaskwebproject/Lib/encodings/gbk.py | 39 + flaskwebproject/Lib/encodings/hex_codec.py | 55 + flaskwebproject/Lib/encodings/hp_roman8.py | 314 + flaskwebproject/Lib/encodings/hz.py | 39 + flaskwebproject/Lib/encodings/idna.py | 309 + flaskwebproject/Lib/encodings/iso2022_jp.py | 39 + flaskwebproject/Lib/encodings/iso2022_jp_1.py | 39 + flaskwebproject/Lib/encodings/iso2022_jp_2.py | 39 + .../Lib/encodings/iso2022_jp_2004.py | 39 + flaskwebproject/Lib/encodings/iso2022_jp_3.py | 39 + .../Lib/encodings/iso2022_jp_ext.py | 39 + flaskwebproject/Lib/encodings/iso2022_kr.py | 39 + flaskwebproject/Lib/encodings/iso8859_1.py | 307 + flaskwebproject/Lib/encodings/iso8859_10.py | 307 + flaskwebproject/Lib/encodings/iso8859_11.py | 307 + flaskwebproject/Lib/encodings/iso8859_13.py | 307 + flaskwebproject/Lib/encodings/iso8859_14.py | 307 + flaskwebproject/Lib/encodings/iso8859_15.py | 307 + flaskwebproject/Lib/encodings/iso8859_16.py | 307 + flaskwebproject/Lib/encodings/iso8859_2.py | 307 + flaskwebproject/Lib/encodings/iso8859_3.py | 307 + flaskwebproject/Lib/encodings/iso8859_4.py | 307 + flaskwebproject/Lib/encodings/iso8859_5.py | 307 + flaskwebproject/Lib/encodings/iso8859_6.py | 307 + flaskwebproject/Lib/encodings/iso8859_7.py | 307 + flaskwebproject/Lib/encodings/iso8859_8.py | 307 + flaskwebproject/Lib/encodings/iso8859_9.py | 307 + flaskwebproject/Lib/encodings/johab.py | 39 + flaskwebproject/Lib/encodings/koi8_r.py | 307 + flaskwebproject/Lib/encodings/koi8_t.py | 308 + flaskwebproject/Lib/encodings/koi8_u.py | 307 + flaskwebproject/Lib/encodings/kz1048.py | 307 + flaskwebproject/Lib/encodings/latin_1.py | 50 + flaskwebproject/Lib/encodings/mac_arabic.py | 698 ++ flaskwebproject/Lib/encodings/mac_centeuro.py | 307 + flaskwebproject/Lib/encodings/mac_croatian.py | 307 + flaskwebproject/Lib/encodings/mac_cyrillic.py | 307 + flaskwebproject/Lib/encodings/mac_farsi.py | 307 + flaskwebproject/Lib/encodings/mac_greek.py | 307 + flaskwebproject/Lib/encodings/mac_iceland.py | 307 + flaskwebproject/Lib/encodings/mac_latin2.py | 312 + flaskwebproject/Lib/encodings/mac_roman.py | 307 + flaskwebproject/Lib/encodings/mac_romanian.py | 307 + flaskwebproject/Lib/encodings/mac_turkish.py | 307 + flaskwebproject/Lib/encodings/mbcs.py | 47 + flaskwebproject/Lib/encodings/oem.py | 41 + flaskwebproject/Lib/encodings/palmos.py | 308 + flaskwebproject/Lib/encodings/ptcp154.py | 312 + flaskwebproject/Lib/encodings/punycode.py | 237 + flaskwebproject/Lib/encodings/quopri_codec.py | 56 + .../Lib/encodings/raw_unicode_escape.py | 45 + flaskwebproject/Lib/encodings/rot_13.py | 113 + flaskwebproject/Lib/encodings/shift_jis.py | 39 + .../Lib/encodings/shift_jis_2004.py | 39 + .../Lib/encodings/shift_jisx0213.py | 39 + flaskwebproject/Lib/encodings/tis_620.py | 307 + flaskwebproject/Lib/encodings/undefined.py | 49 + .../Lib/encodings/unicode_escape.py | 45 + .../Lib/encodings/unicode_internal.py | 45 + flaskwebproject/Lib/encodings/utf_16.py | 155 + flaskwebproject/Lib/encodings/utf_16_be.py | 42 + flaskwebproject/Lib/encodings/utf_16_le.py | 42 + flaskwebproject/Lib/encodings/utf_32.py | 150 + flaskwebproject/Lib/encodings/utf_32_be.py | 37 + flaskwebproject/Lib/encodings/utf_32_le.py | 37 + flaskwebproject/Lib/encodings/utf_7.py | 38 + flaskwebproject/Lib/encodings/utf_8.py | 42 + flaskwebproject/Lib/encodings/utf_8_sig.py | 130 + flaskwebproject/Lib/encodings/uu_codec.py | 99 + flaskwebproject/Lib/encodings/zlib_codec.py | 77 + flaskwebproject/Lib/fnmatch.py | 109 + flaskwebproject/Lib/genericpath.py | 151 + flaskwebproject/Lib/ntpath.py | 693 ++ flaskwebproject/Lib/os.py | 1069 ++ flaskwebproject/Lib/posixpath.py | 522 + flaskwebproject/README.md | 2 + flaskwebproject/migrations/README | 1 + flaskwebproject/migrations/alembic.ini | 47 + flaskwebproject/migrations/env.py | 90 + flaskwebproject/migrations/script.py.mako | 24 + .../versions/d0c0042067ee_initial_revision.py | 28 + .../d2ecd9d1e0a5_secondary_revision.py | 28 + ...WebProject1.pyproj.CoreCompileInputs.cache | 1 + ...askWebProject1.pyproj.FileListAbsolute.txt | 1 + flaskwebproject/old-migrations/README | 1 + flaskwebproject/old-migrations/alembic.ini | 47 + flaskwebproject/old-migrations/env.py | 90 + flaskwebproject/old-migrations/script.py.mako | 24 + .../versions/12d1282e5878_update_tables.py | 28 + .../290d53d3d79a_json_column_changes.py | 28 + .../versions/996b9a5c9829_create_tables.py | 210 + .../versions/f758d3dfa2bf_update_tables.py | 24 + flaskwebproject/requirements.txt | 4 + flaskwebproject/runserver.py | 14 + flaskwebproject/setenv.bat | 3 + flaskwebproject/webapp.py | 14 + 4052 files changed, 807510 insertions(+) create mode 100644 .gitignore create mode 100644 flaskwebproject/FlaskWebProject1.pyproj create mode 100644 flaskwebproject/FlaskWebProject1.pyproj.user create mode 100644 flaskwebproject/FlaskWebProject1/Include/Python-ast.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/Python.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/abstract.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/accu.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/asdl.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/ast.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/bitset.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/bltinmodule.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/boolobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/bytearrayobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/bytes_methods.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/bytesobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/cellobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/ceval.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/classobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/code.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/codecs.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/compile.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/complexobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/datetime.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/descrobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/dictobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/dtoa.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/dynamic_annotations.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/enumobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/errcode.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/eval.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/fileobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/fileutils.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/floatobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/frameobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/funcobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/genobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/graminit.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/grammar.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/import.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/intrcheck.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/iterobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/listobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/longintrepr.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/longobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/marshal.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/memoryobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/metagrammar.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/methodobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/modsupport.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/moduleobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/namespaceobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/node.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/object.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/objimpl.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/odictobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/opcode.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/osdefs.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/osmodule.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/parsetok.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/patchlevel.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pgen.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pgenheaders.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/py_curses.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyarena.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyatomic.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pycapsule.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyconfig.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyctype.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pydebug.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pydtrace.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyerrors.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyexpat.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyfpe.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pygetopt.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyhash.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pylifecycle.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pymacconfig.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pymacro.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pymath.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pymem.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pyport.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pystate.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pystrcmp.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pystrhex.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pystrtod.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pythonrun.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pythread.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/pytime.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/rangeobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/setobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/sliceobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/structmember.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/structseq.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/symtable.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/sysmodule.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/token.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/traceback.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/tupleobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/typeslots.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/ucnhash.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/unicodeobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/warnings.h create mode 100644 flaskwebproject/FlaskWebProject1/Include/weakrefobject.h create mode 100644 flaskwebproject/FlaskWebProject1/Lib/__future__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/_bootlocale.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/_collections_abc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/_dummy_thread.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/_weakrefset.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/abc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/base64.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/bisect.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/codecs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/collections/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/collections/abc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/copy.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/copyreg.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/distutils/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/distutils/distutils.cfg create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/aliases.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/ascii.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/base64_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/big5.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/big5hkscs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/bz2_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/charmap.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp037.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1006.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1026.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1125.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1140.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1250.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1251.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1252.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1253.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1254.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1255.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1256.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1257.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp1258.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp273.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp424.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp437.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp500.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp65001.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp720.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp737.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp775.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp850.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp852.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp855.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp856.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp857.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp858.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp860.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp861.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp862.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp863.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp864.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp865.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp866.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp869.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp874.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp875.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp932.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp949.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/cp950.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jis_2004.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jisx0213.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jp.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/euc_kr.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/gb18030.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/gb2312.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/gbk.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/hex_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/hp_roman8.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/hz.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/idna.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_1.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2004.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_3.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_ext.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_kr.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_1.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_10.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_11.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_13.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_14.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_15.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_16.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_2.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_3.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_4.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_5.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_6.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_7.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_8.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_9.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/johab.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_r.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_t.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_u.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/kz1048.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/latin_1.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_arabic.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_centeuro.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_croatian.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_cyrillic.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_farsi.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_greek.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_iceland.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_latin2.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_roman.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_romanian.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mac_turkish.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/mbcs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/oem.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/palmos.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/ptcp154.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/punycode.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/quopri_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/raw_unicode_escape.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/rot_13.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis_2004.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jisx0213.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/tis_620.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/undefined.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_escape.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_internal.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_be.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_le.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_be.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_le.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_7.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8_sig.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/uu_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/encodings/zlib_codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/enum.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/fnmatch.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/functools.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/genericpath.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/hashlib.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/heapq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/hmac.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/imp.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap_external.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/abc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/machinery.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/importlib/util.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/io.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/keyword.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/linecache.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/no-global-site-packages.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/ntpath.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/operator.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/orig-prefix.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/os.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/posixpath.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/random.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/re.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/reprlib.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/rlcompleter.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/shutil.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/easy_install.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__main__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/build_env.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cache.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/configuration.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/download.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/index.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/locations.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/index.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/link.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pep425tags.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/resolve.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/outdated.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/ui.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/wheel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distro.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/helpers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/core.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/zip-safe create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/archive_util.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/build_meta.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/alias.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_py.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/develop.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/register.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/rotate.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/sdist.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/setopt.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/test.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/config.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dep_util.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/depends.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dist.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extension.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glibc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glob.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/launch.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/monkey.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/msvc.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/namespaces.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/package_index.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/pep425tags.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py27compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py31compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py33compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py36compat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/sandbox.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script.tmpl create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/site-patch.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/ssl_support.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/version.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/wheel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/windows_support.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__main__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/bdist_wheel.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/convert.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/install.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/pack.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/unpack.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/metadata.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pep425tags.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pkginfo.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/util.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/wheelfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/site.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/sre_compile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/sre_constants.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/sre_parse.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/stat.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/struct.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/tcl8.6/init.tcl create mode 100644 flaskwebproject/FlaskWebProject1/Lib/tempfile.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/token.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/tokenize.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/types.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/warnings.py create mode 100644 flaskwebproject/FlaskWebProject1/Lib/weakref.py create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/activate create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/activate.bat create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/activate.ps1 create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/activate_this.py create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/deactivate.bat create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/easy_install-3.6.exe create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/pip.exe create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/python.exe create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/python3.dll create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/python36.dll create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/pythonw.exe create mode 100644 flaskwebproject/FlaskWebProject1/Scripts/wheel.exe create mode 100644 flaskwebproject/FlaskWebProject1/__init__.py create mode 100644 flaskwebproject/FlaskWebProject1/models.py create mode 100644 flaskwebproject/FlaskWebProject1/routes.py create mode 100644 flaskwebproject/FlaskWebProject1/static/content/bootstrap.css create mode 100644 flaskwebproject/FlaskWebProject1/static/content/bootstrap.min.css create mode 100644 flaskwebproject/FlaskWebProject1/static/content/site.css create mode 100644 flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.eot create mode 100644 flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.svg create mode 100644 flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.ttf create mode 100644 flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.woff create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/_references.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/bootstrap.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/bootstrap.min.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery-1.10.2.intellisense.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery-1.10.2.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery-1.10.2.min.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery-1.10.2.min.map create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery.validate-vsdoc.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery.validate.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery.validate.min.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery.validate.unobtrusive.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/jquery.validate.unobtrusive.min.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/modernizr-2.6.2.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/respond.js create mode 100644 flaskwebproject/FlaskWebProject1/static/scripts/respond.min.js create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/auto.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/ascii.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1250.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1251.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1252.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1253.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1254.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1255.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1256.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1257.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp1258.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp437.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp737.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp775.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp850.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp852.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp855.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp857.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp860.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp861.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp862.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp863.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp864.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp865.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp866.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp869.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp874.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/cp932.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/dingbats.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/ebcdic.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/gb1988.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso2022-jp.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso2022-kr.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso2022.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-1.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-10.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-13.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-14.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-15.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-16.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-2.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-3.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-4.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-5.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-6.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-7.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-8.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/iso8859-9.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/jis0201.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/koi8-r.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/koi8-u.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macCentEuro.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macCroatian.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macCyrillic.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macDingbats.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macGreek.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macIceland.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macJapan.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macRoman.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macRomania.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macThai.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macTurkish.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/macUkraine.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/shiftjis.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/symbol.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/encoding/tis-620.enc create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/history.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/http1.0/http.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/http1.0/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/init.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/af.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/af_za.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ar.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ar_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ar_jo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ar_lb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ar_sy.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/be.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/bg.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/bn.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/bn_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ca.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/cs.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/da.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/de.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/de_at.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/de_be.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/el.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_au.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_be.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_bw.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_ca.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_gb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_hk.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_ie.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_nz.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_ph.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_sg.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_za.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/en_zw.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/eo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_ar.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_bo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_cl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_co.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_cr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_do.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_ec.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_gt.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_hn.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_mx.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_ni.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_pa.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_pe.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_pr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_py.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_sv.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_uy.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/es_ve.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/et.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/eu.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/eu_es.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fa.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fa_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fa_ir.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fi.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fo_fo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fr_be.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fr_ca.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/fr_ch.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ga.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ga_ie.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/gl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/gl_es.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/gv.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/gv_gb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/he.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/hi.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/hi_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/hr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/hu.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/id.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/id_id.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/is.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/it.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/it_ch.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ja.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kl_gl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ko.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ko_kr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kok.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kok_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kw.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/kw_gb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/lt.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/lv.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/mk.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/mr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/mr_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ms.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ms_my.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/mt.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/nb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/nl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/nl_be.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/nn.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/pl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/pt.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/pt_br.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ro.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ru.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ru_ua.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sh.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sk.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sq.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sv.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/sw.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ta.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/ta_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/te.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/te_in.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/th.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/tr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/uk.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/vi.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/zh.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/zh_cn.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/zh_hk.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/zh_sg.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/msgs/zh_tw.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/opt0.4/optparse.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/opt0.4/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/package.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/parray.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/safe.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tclIndex create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tm.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Abidjan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Accra create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Addis_Ababa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Algiers create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Asmara create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Asmera create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Bamako create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Bangui create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Banjul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Bissau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Blantyre create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Brazzaville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Bujumbura create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Cairo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Casablanca create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Ceuta create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Conakry create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Dakar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Djibouti create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Douala create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/El_Aaiun create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Freetown create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Gaborone create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Harare create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Johannesburg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Juba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Kampala create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Khartoum create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Kigali create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Kinshasa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Lagos create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Libreville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Lome create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Luanda create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Lubumbashi create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Lusaka create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Malabo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Maputo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Maseru create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Mbabane create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Mogadishu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Monrovia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Nairobi create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Ndjamena create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Niamey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Nouakchott create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Ouagadougou create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Porto-Novo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Sao_Tome create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Timbuktu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Tripoli create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Tunis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Africa/Windhoek create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Adak create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Anchorage create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Anguilla create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Antigua create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Araguaina create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Catamarca create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Cordoba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Jujuy create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Mendoza create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Salta create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/San_Juan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/San_Luis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Tucuman create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Aruba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Asuncion create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Atikokan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Atka create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Bahia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Bahia_Banderas create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Barbados create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Belem create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Belize create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Blanc-Sablon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Boa_Vista create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Bogota create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Boise create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Buenos_Aires create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cambridge_Bay create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Campo_Grande create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cancun create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Caracas create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Catamarca create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cayenne create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cayman create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Chicago create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Chihuahua create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Coral_Harbour create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cordoba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Costa_Rica create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Creston create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Cuiaba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Curacao create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Danmarkshavn create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Dawson create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Dawson_Creek create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Denver create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Detroit create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Dominica create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Edmonton create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Eirunepe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/El_Salvador create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Ensenada create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Fort_Nelson create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Fort_Wayne create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Fortaleza create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Glace_Bay create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Godthab create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Goose_Bay create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Grand_Turk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Grenada create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Guadeloupe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Guatemala create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Guayaquil create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Guyana create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Halifax create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Havana create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Hermosillo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Knox create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Marengo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Petersburg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Tell_City create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Vevay create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Vincennes create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indiana/Winamac create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Indianapolis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Inuvik create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Iqaluit create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Jamaica create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Jujuy create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Juneau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Kentucky/Louisville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Kentucky/Monticello create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Knox_IN create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Kralendijk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/La_Paz create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Lima create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Los_Angeles create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Louisville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Lower_Princes create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Maceio create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Managua create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Manaus create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Marigot create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Martinique create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Matamoros create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Mazatlan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Mendoza create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Menominee create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Merida create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Metlakatla create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Mexico_City create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Miquelon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Moncton create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Monterrey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Montevideo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Montreal create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Montserrat create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Nassau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/New_York create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Nipigon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Nome create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Noronha create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/North_Dakota/Center create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Ojinaga create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Panama create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Pangnirtung create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Paramaribo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Phoenix create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Port-au-Prince create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Port_of_Spain create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Porto_Acre create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Porto_Velho create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Puerto_Rico create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Rainy_River create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Rankin_Inlet create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Recife create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Regina create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Resolute create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Rio_Branco create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Rosario create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Santa_Isabel create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Santarem create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Santiago create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Santo_Domingo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Sao_Paulo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Scoresbysund create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Shiprock create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Sitka create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Barthelemy create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Johns create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Kitts create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Lucia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Thomas create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/St_Vincent create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Swift_Current create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Tegucigalpa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Thule create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Thunder_Bay create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Tijuana create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Toronto create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Tortola create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Vancouver create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Virgin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Whitehorse create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Winnipeg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Yakutat create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/America/Yellowknife create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Casey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Davis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Macquarie create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Mawson create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/McMurdo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Palmer create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Rothera create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/South_Pole create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Syowa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Troll create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Antarctica/Vostok create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Arctic/Longyearbyen create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Aden create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Almaty create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Amman create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Anadyr create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Aqtau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Aqtobe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ashgabat create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ashkhabad create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Baghdad create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Bahrain create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Baku create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Bangkok create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Barnaul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Beirut create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Bishkek create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Brunei create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Calcutta create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Chita create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Choibalsan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Chongqing create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Chungking create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Colombo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Dacca create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Damascus create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Dhaka create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Dili create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Dubai create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Dushanbe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Gaza create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Harbin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Hebron create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Hong_Kong create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Hovd create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Irkutsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Istanbul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Jakarta create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Jayapura create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Jerusalem create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kabul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kamchatka create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Karachi create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kashgar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kathmandu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Katmandu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Khandyga create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kolkata create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kuching create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Kuwait create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Macao create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Macau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Magadan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Makassar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Manila create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Muscat create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Nicosia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Novokuznetsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Novosibirsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Omsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Oral create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Phnom_Penh create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Pontianak create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Pyongyang create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Qatar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Qyzylorda create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Rangoon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Riyadh create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Saigon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Sakhalin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Samarkand create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Seoul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Shanghai create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Singapore create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Srednekolymsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Taipei create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tashkent create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tbilisi create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tehran create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tel_Aviv create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Thimbu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Thimphu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tokyo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Tomsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ulan_Bator create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Urumqi create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Ust-Nera create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Vientiane create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Vladivostok create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Yakutsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Yekaterinburg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Asia/Yerevan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Azores create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Bermuda create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Canary create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Faeroe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Faroe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Madeira create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Reykjavik create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/South_Georgia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/St_Helena create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Atlantic/Stanley create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/ACT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Adelaide create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Brisbane create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Broken_Hill create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Canberra create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Currie create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Darwin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Eucla create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Hobart create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/LHI create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Lindeman create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Lord_Howe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Melbourne create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/NSW create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/North create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Perth create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Queensland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/South create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Sydney create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Tasmania create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Victoria create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/West create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Australia/Yancowinna create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Brazil/Acre create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Brazil/DeNoronha create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Brazil/East create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Brazil/West create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/CET create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/CST6CDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Atlantic create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Central create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Eastern create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Mountain create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Newfoundland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Pacific create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Saskatchewan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Canada/Yukon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Chile/Continental create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Chile/EasterIsland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Cuba create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/EET create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/EST create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/EST5EDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Egypt create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Eire create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+1 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+10 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+11 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+12 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+2 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+3 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+4 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+5 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+6 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+7 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+8 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT+9 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-1 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-10 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-11 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-12 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-13 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-14 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-2 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-3 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-4 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-5 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-6 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-7 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-8 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT-9 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/GMT0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/Greenwich create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/UCT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/UTC create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/Universal create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Etc/Zulu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Amsterdam create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Andorra create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Astrakhan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Athens create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Belfast create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Belgrade create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Berlin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Bratislava create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Brussels create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Bucharest create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Budapest create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Busingen create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Chisinau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Copenhagen create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Dublin create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Gibraltar create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Guernsey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Helsinki create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Isle_of_Man create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Istanbul create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Jersey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Kaliningrad create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Kiev create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Kirov create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Lisbon create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Ljubljana create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/London create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Luxembourg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Madrid create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Malta create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Mariehamn create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Minsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Monaco create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Moscow create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Nicosia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Oslo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Paris create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Podgorica create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Prague create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Riga create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Rome create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Samara create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/San_Marino create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Sarajevo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Simferopol create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Skopje create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Sofia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Stockholm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Tallinn create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Tirane create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Tiraspol create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Ulyanovsk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Uzhgorod create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Vaduz create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Vatican create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Vienna create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Vilnius create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Volgograd create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Warsaw create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Zagreb create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Zaporozhye create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Europe/Zurich create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GB create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GB-Eire create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GMT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GMT+0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GMT-0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/GMT0 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Greenwich create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/HST create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Hongkong create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Iceland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Antananarivo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Chagos create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Christmas create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Cocos create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Comoro create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Kerguelen create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Mahe create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Maldives create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Mauritius create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Mayotte create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Indian/Reunion create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Iran create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Israel create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Jamaica create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Japan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Kwajalein create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Libya create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/MET create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/MST create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/MST7MDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Mexico/BajaNorte create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Mexico/BajaSur create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Mexico/General create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/NZ create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/NZ-CHAT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Navajo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/PRC create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/PST8PDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Apia create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Auckland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Bougainville create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Chatham create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Chuuk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Easter create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Efate create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Enderbury create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Fakaofo create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Fiji create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Funafuti create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Galapagos create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Gambier create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Guadalcanal create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Guam create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Honolulu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Johnston create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Kiritimati create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Kosrae create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Kwajalein create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Majuro create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Marquesas create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Midway create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Nauru create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Niue create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Norfolk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Noumea create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Pago_Pago create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Palau create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Pitcairn create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Pohnpei create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Ponape create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Port_Moresby create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Rarotonga create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Saipan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Samoa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Tahiti create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Tarawa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Tongatapu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Truk create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Wake create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Wallis create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Pacific/Yap create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Poland create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Portugal create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/ROC create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/ROK create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Singapore create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/AST4 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/AST4ADT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/CST6 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/CST6CDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/EST5 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/EST5EDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/HST10 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/MST7 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/MST7MDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/PST8 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/PST8PDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/YST9 create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/SystemV/YST9YDT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Turkey create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/UCT create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Alaska create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Aleutian create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Arizona create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Central create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/East-Indiana create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Eastern create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Hawaii create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Indiana-Starke create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Michigan create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Mountain create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Pacific create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Pacific-New create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/US/Samoa create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/UTC create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Universal create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/W-SU create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/WET create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/tzdata/Zulu create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tcl8.6/word.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/bgerror.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/button.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/choosedir.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/clrpick.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/comdlg.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/console.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/README create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/anilabel.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/aniwave.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/arrow.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/bind.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/bitmap.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/browse create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/button.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/check.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/clrpick.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/colors.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/combo.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/cscroll.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ctext.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/dialog1.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/dialog2.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/en.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/entry1.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/entry2.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/entry3.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/filebox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/fontchoose.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/form.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/hello create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/hscale.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/icon.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/image1.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/image2.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/earthris.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/flagdown.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/flagup.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/gray25.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/letters.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/noletter.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/pattern.xbm create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/images/tcllogo.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/items.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ixset create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/knightstour.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/label.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/labelframe.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/license.terms create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/mclist.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/menu.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/menubu.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/msgbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/nl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/paned1.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/paned2.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/pendulum.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/plot.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/puzzle.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/radio.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/rmt create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/rolodex create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ruler.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/sayings.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/search.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/spin.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/square create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/states.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/style.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/tclIndex create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/tcolor create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/text.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/textpeer.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/timer create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/toolbar.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/tree.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttkbut.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttkmenu.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttknote.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttkpane.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttkprogress.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/ttkscale.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/twind.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/unicodeout.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/vscale.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/demos/widget create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/dialog.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/entry.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/focus.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/fontchooser.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/iconlist.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/icons.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/README create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/logo.eps create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/logo100.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/logo64.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/logoLarge.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/logoMed.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo.eps create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo100.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo150.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo175.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo200.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/pwrdLogo75.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/images/tai-ku.gif create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/license.terms create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/listbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/megawidget.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/menu.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/mkpsenc.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/cs.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/da.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/de.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/el.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/en.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/en_gb.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/eo.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/es.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/fr.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/hu.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/it.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/nl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/pl.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/pt.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/ru.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/msgs/sv.msg create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/obsolete.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/optMenu.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/palette.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/panedwindow.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/safetk.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/scale.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/scrlbar.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/spinbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/tclIndex create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/tearoff.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/text.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/tk.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/tkfbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/altTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/aquaTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/button.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/clamTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/classicTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/combobox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/cursors.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/defaults.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/entry.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/fonts.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/menubutton.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/notebook.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/panedwindow.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/progress.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/scale.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/scrollbar.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/sizegrip.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/spinbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/treeview.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/ttk.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/utils.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/vistaTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/winTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/ttk/xpTheme.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/unsupported.tcl create mode 100644 flaskwebproject/FlaskWebProject1/tcl/tk8.6/xmfbox.tcl create mode 100644 flaskwebproject/FlaskWebProject1/templates/about.html create mode 100644 flaskwebproject/FlaskWebProject1/templates/contact.html create mode 100644 flaskwebproject/FlaskWebProject1/templates/index.html create mode 100644 flaskwebproject/FlaskWebProject1/templates/layout.html create mode 100644 flaskwebproject/FlaskWebProject1/templates/resume.html create mode 100644 flaskwebproject/FlaskWebProject1/templates/tvmedia.html create mode 100644 flaskwebproject/FlaskWebProject1/views.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/__future__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/_bootlocale.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/_collections_abc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/_dummy_thread.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/_weakrefset.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/abc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/base64.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/bisect.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/codecs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/collections/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/collections/abc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/copy.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/copyreg.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/distutils/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/distutils/distutils.cfg create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/aliases.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/ascii.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/base64_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/big5.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/big5hkscs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/bz2_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/charmap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp037.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1006.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1026.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1125.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1140.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1250.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1251.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1252.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1253.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1254.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1255.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1256.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1257.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp1258.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp273.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp424.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp437.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp500.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp65001.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp720.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp737.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp775.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp850.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp852.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp855.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp856.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp857.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp858.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp860.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp861.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp862.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp863.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp864.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp865.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp866.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp869.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp874.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp875.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp932.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp949.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/cp950.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/euc_jis_2004.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/euc_jisx0213.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/euc_jp.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/euc_kr.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/gb18030.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/gb2312.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/gbk.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/hex_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/hp_roman8.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/hz.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/idna.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp_1.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp_2.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp_2004.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp_3.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_jp_ext.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso2022_kr.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_1.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_10.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_11.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_13.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_14.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_15.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_16.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_2.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_3.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_4.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_5.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_6.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_7.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_8.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/iso8859_9.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/johab.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/koi8_r.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/koi8_t.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/koi8_u.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/kz1048.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/latin_1.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_arabic.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_centeuro.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_croatian.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_cyrillic.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_farsi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_greek.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_iceland.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_latin2.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_roman.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_romanian.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mac_turkish.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/mbcs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/oem.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/palmos.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/ptcp154.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/punycode.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/quopri_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/raw_unicode_escape.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/rot_13.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/shift_jis.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/shift_jis_2004.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/shift_jisx0213.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/tis_620.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/undefined.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/unicode_escape.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/unicode_internal.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_16.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_16_be.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_16_le.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_32.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_32_be.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_32_le.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_7.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_8.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/utf_8_sig.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/uu_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/encodings/zlib_codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/enum.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/fnmatch.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/functools.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/genericpath.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/hashlib.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/heapq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/hmac.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/imp.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/importlib/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/importlib/_bootstrap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/importlib/abc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/importlib/machinery.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/importlib/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/io.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/keyword.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/linecache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/locale.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/no-global-site-packages.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/ntpath.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/operator.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/orig-prefix.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/os.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/posixpath.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/random.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/re.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/reprlib.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/rlcompleter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/shutil.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Click-7.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask-0.12.4.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_Migrate-2.3.1.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Flask_SQLAlchemy-2.3.2.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/AUTHORS create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Mako-1.0.7.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/SQLAlchemy-1.2.14.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic-1.0.5.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/autogenerate/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/autogenerate/api.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/autogenerate/compare.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/autogenerate/render.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/autogenerate/rewriter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/command.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/context.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/impl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/mssql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/mysql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/oracle.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/postgresql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/ddl/sqlite.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/op.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/batch.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/ops.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/schemaobj.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/operations/toimpl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/runtime/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/runtime/environment.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/runtime/migration.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/script/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/script/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/script/revision.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/generic/README create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/generic/alembic.ini.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/generic/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/generic/script.py.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/multidb/README create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/multidb/alembic.ini.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/multidb/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/multidb/script.py.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/pylons/README create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/pylons/alembic.ini.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/pylons/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/templates/pylons/script.py.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/assertions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/engines.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/exclusions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/fixtures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/mock.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/plugin/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/plugin/bootstrap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/plugin/noseplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/plugin/plugin_base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/plugin/pytestplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/provision.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/requirements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/runner.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/testing/warnings.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/exc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/langhelpers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/messaging.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/pyfiles.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/alembic/util/sqla_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_bashcomplete.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_termui_impl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_textwrap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_unicodefun.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/_winconsole.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/decorators.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/formatting.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/globals.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/termui.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/testing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/types.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/click/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config-0.4.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/_common.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/_version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/easter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/parser/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/parser/_parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/parser/isoparser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/relativedelta.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/rrule.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tz/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tz/_common.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tz/_factories.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tz/tz.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tz/win.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/tzwin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/zoneinfo/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/dateutil/zoneinfo/rebuild.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/easy_install.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/editor.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/__main__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/app.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/blueprints.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/cli.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/ctx.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/debughelpers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/ext/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/exthook.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/globals.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/helpers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/json.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/logging.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/sessions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/signals.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/templating.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/testing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/views.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask/wrappers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/cli.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask-multidb/README create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask-multidb/alembic.ini.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask-multidb/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask-multidb/script.py.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask/README create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask/alembic.ini.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask/env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_migrate/templates/flask/script.py.mako create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_sqlalchemy/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_sqlalchemy/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/flask_sqlalchemy/model.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/_json.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/encoding.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/exc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/jws.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/serializer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/signer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/timed.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/itsdangerous/url_safe.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/_identifier.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/asyncfilters.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/asyncsupport.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/bccache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/constants.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/debug.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/defaults.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/environment.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/ext.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/filters.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/idtracking.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/lexer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/loaders.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/meta.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/nativetypes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/nodes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/optimizer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/runtime.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/sandbox.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/tests.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/jinja2/visitor.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/_ast_util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ast.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/cmd.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/codegen.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/autohandler.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/babelplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/beaker_cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/extract.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/linguaplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/preprocessors.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/pygmentplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/ext/turbogears.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/filters.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/lexer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/lookup.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/parsetree.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/pygen.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/pyparser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/runtime.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/template.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/mako/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/markupsafe/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/markupsafe/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/markupsafe/_constants.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/markupsafe/_native.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/markupsafe/_speedups.cp36-win_amd64.pyd create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip-18.1.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/__main__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/build_env.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/configuration.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/download.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/index.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/locations.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/models/index.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/models/link.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/pep425tags.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/resolve.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/outdated.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/utils/ui.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_internal/wheel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/distro.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/progress/helpers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pytoml/core.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc-4.0.24.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/pyodbc.cp36-win_amd64.pyd create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_dateutil-2.7.5.dist-info/zip-safe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/python_editor-1.0.3.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-39.0.1.dist-info/zip-safe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools-40.6.2.dist-info/zip-safe create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/archive_util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/build_meta.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/alias.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/build_py.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/develop.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/install.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/register.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/rotate.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/sdist.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/setopt.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/test.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/upload.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/dep_util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/depends.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/dist.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/extension.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/glibc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/glob.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/launch.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/monkey.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/msvc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/namespaces.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/package_index.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/pep425tags.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/py27compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/py31compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/py33compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/py36compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/sandbox.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/script.tmpl create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/site-patch.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/ssl_support.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/version.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/wheel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/setuptools/windows_support.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six-1.11.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/six.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/connectors/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/connectors/mxodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/connectors/zxJDBC.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/cprocessors.cp36-win_amd64.pyd create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/cresultproxy.cp36-win_amd64.pyd create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/cutils.cp36-win_amd64.pyd create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/databases/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/firebird/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/firebird/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/firebird/fdb.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/adodbapi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/mxodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mssql/zxjdbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/dml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/gaerdbms.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/json.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/oursql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/types.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/mysql/zxjdbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/oracle/zxjdbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/array.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/dml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/ext.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/json.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/pygresql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/pypostgresql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/postgresql/zxjdbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sybase/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sybase/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sybase/mxodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sybase/pyodbc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/dialects/sybase/pysybase.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/default.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/interfaces.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/reflection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/result.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/strategies.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/threadlocal.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/url.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/engine/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/api.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/attr.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/legacy.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/event/registry.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/events.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/exc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/associationproxy.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/automap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/baked.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/compiler.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/declarative/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/declarative/api.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/declarative/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/declarative/clsregistry.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/horizontal_shard.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/hybrid.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/indexable.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/instrumentation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/mutable.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/orderinglist.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/ext/serializer.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/inspection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/interfaces.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/log.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/attributes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/collections.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/dependency.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/deprecated_interfaces.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/dynamic.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/evaluator.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/events.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/exc.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/identity.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/instrumentation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/interfaces.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/loading.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/mapper.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/path_registry.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/persistence.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/properties.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/query.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/relationships.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/scoping.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/session.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/state.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/strategies.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/strategy_options.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/sync.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/unitofwork.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/orm/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/pool.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/processors.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/schema.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/annotation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/compiler.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/crud.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/ddl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/default_comparator.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/dml.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/elements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/expression.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/functions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/naming.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/operators.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/schema.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/selectable.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/sqltypes.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/type_api.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/sql/visitors.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/assertions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/assertsql.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/config.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/engines.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/entities.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/exclusions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/fixtures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/mock.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/pickleable.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/plugin/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/plugin/noseplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/profiling.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/provision.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/replay_fixture.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/requirements.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/runner.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/schema.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_cte.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_ddl.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_dialect.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_select.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_sequence.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/testing/warnings.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/types.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/_collections.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/deprecations.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/langhelpers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/queue.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/sqlalchemy/util/topological.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/AUTHORS.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv-16.1.0.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv_support/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv_support/pip-18.1-py2.py3-none-any.whl create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv_support/setuptools-40.5.0-py2.py3-none-any.whl create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/virtualenv_support/wheel-0.32.2-py2.py3-none-any.whl create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/_compat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/_internal.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/_reloader.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/atom.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/cache.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/fixers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/iterio.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/jsrouting.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/limiter.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/lint.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/profiler.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/securecookie.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/sessions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/testtools.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/contrib/wrappers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/datastructures.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/console.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/source.png create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/exceptions.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/filesystem.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/formparser.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/http.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/local.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/posixemulation.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/routing.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/script.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/security.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/serving.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/test.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/testapp.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/urls.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/useragents.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/utils.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/websocket.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/wrappers.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/werkzeug/wsgi.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/INSTALLER create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/LICENSE.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/METADATA create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/RECORD create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/WHEEL create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/entry_points.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel-0.32.3.dist-info/top_level.txt create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/__main__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/bdist_wheel.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/cli/__init__.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/cli/convert.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/cli/install.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/cli/pack.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/cli/unpack.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/metadata.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/pep425tags.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/pkginfo.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/util.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site-packages/wheel/wheelfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/site.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/sre_compile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/sre_constants.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/sre_parse.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/stat.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/struct.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/tarfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/tcl8.6/init.tcl create mode 100644 flaskwebproject/FlaskWebenv/Lib/tempfile.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/token.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/tokenize.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/types.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/warnings.py create mode 100644 flaskwebproject/FlaskWebenv/Lib/weakref.py create mode 100644 flaskwebproject/FlaskWebenv/Scripts/Activate.ps1 create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_asyncio.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_bz2.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_ctypes.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_ctypes_test.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_decimal.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_distutils_findvs.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_elementtree.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_hashlib.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_lzma.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_msi.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_multiprocessing.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_overlapped.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_socket.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_sqlite3.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_ssl.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_testbuffer.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_testcapi.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_testconsole.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_testimportmultiple.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_testmultiphase.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/_tkinter.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/activate create mode 100644 flaskwebproject/FlaskWebenv/Scripts/activate.bat create mode 100644 flaskwebproject/FlaskWebenv/Scripts/activate_this.py create mode 100644 flaskwebproject/FlaskWebenv/Scripts/deactivate.bat create mode 100644 flaskwebproject/FlaskWebenv/Scripts/easy_install-3.6.exe create mode 100644 flaskwebproject/FlaskWebenv/Scripts/flask.exe create mode 100644 flaskwebproject/FlaskWebenv/Scripts/pip.exe create mode 100644 flaskwebproject/FlaskWebenv/Scripts/pyexpat.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/select.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/sqlite3.dll create mode 100644 flaskwebproject/FlaskWebenv/Scripts/tcl86t.dll create mode 100644 flaskwebproject/FlaskWebenv/Scripts/tk86t.dll create mode 100644 flaskwebproject/FlaskWebenv/Scripts/unicodedata.pyd create mode 100644 flaskwebproject/FlaskWebenv/Scripts/vcruntime140.dll create mode 100644 flaskwebproject/FlaskWebenv/Scripts/winsound.pyd create mode 100644 flaskwebproject/FlaskWebenv/pyvenv.cfg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/auto.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/ascii.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1250.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1251.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1252.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1253.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1254.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1255.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1256.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1257.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp1258.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp437.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp737.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp775.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp850.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp852.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp855.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp857.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp860.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp861.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp862.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp863.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp864.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp865.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp866.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp869.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp874.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/cp932.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/dingbats.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/ebcdic.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/gb1988.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso2022-jp.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso2022-kr.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso2022.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-1.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-10.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-13.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-14.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-15.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-16.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-2.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-3.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-4.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-5.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-6.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-7.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-8.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/iso8859-9.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/jis0201.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/koi8-r.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/koi8-u.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macCentEuro.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macCroatian.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macCyrillic.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macDingbats.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macGreek.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macIceland.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macJapan.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macRoman.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macRomania.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macThai.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macTurkish.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/macUkraine.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/shiftjis.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/symbol.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/encoding/tis-620.enc create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/history.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/http1.0/http.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/http1.0/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/init.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/af.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/af_za.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ar.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ar_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ar_jo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ar_lb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ar_sy.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/be.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/bg.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/bn.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/bn_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ca.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/cs.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/da.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/de.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/de_at.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/de_be.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/el.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_au.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_be.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_bw.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_ca.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_gb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_hk.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_ie.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_nz.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_ph.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_sg.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_za.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/en_zw.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/eo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_ar.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_bo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_cl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_co.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_cr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_do.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_ec.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_gt.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_hn.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_mx.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_ni.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_pa.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_pe.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_pr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_py.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_sv.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_uy.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/es_ve.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/et.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/eu.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/eu_es.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fa.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fa_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fa_ir.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fi.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fo_fo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fr_be.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fr_ca.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/fr_ch.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ga.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ga_ie.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/gl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/gl_es.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/gv.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/gv_gb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/he.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/hi.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/hi_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/hr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/hu.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/id.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/id_id.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/is.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/it.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/it_ch.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ja.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kl_gl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ko.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ko_kr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kok.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kok_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kw.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/kw_gb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/lt.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/lv.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/mk.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/mr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/mr_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ms.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ms_my.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/mt.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/nb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/nl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/nl_be.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/nn.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/pl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/pt.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/pt_br.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ro.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ru.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ru_ua.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sh.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sk.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sq.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sv.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/sw.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ta.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/ta_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/te.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/te_in.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/th.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/tr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/uk.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/vi.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/zh.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/zh_cn.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/zh_hk.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/zh_sg.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/msgs/zh_tw.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/opt0.4/optparse.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/opt0.4/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/package.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/parray.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/safe.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tclIndex create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tm.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Abidjan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Accra create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Addis_Ababa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Algiers create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Asmara create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Asmera create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Bamako create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Bangui create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Banjul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Bissau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Blantyre create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Brazzaville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Bujumbura create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Cairo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Casablanca create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Ceuta create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Conakry create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Dakar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Djibouti create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Douala create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/El_Aaiun create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Freetown create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Gaborone create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Harare create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Johannesburg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Juba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Kampala create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Khartoum create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Kigali create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Kinshasa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Lagos create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Libreville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Lome create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Luanda create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Lubumbashi create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Lusaka create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Malabo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Maputo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Maseru create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Mbabane create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Mogadishu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Monrovia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Nairobi create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Ndjamena create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Niamey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Nouakchott create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Ouagadougou create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Porto-Novo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Sao_Tome create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Timbuktu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Tripoli create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Tunis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Africa/Windhoek create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Adak create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Anchorage create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Anguilla create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Antigua create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Araguaina create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Catamarca create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Cordoba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Jujuy create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Mendoza create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Salta create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/San_Juan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/San_Luis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Tucuman create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Aruba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Asuncion create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Atikokan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Atka create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Bahia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Bahia_Banderas create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Barbados create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Belem create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Belize create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Blanc-Sablon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Boa_Vista create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Bogota create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Boise create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Buenos_Aires create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cambridge_Bay create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Campo_Grande create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cancun create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Caracas create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Catamarca create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cayenne create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cayman create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Chicago create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Chihuahua create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Coral_Harbour create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cordoba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Costa_Rica create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Creston create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Cuiaba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Curacao create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Danmarkshavn create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Dawson create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Dawson_Creek create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Denver create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Detroit create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Dominica create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Edmonton create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Eirunepe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/El_Salvador create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Ensenada create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Fort_Nelson create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Fort_Wayne create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Fortaleza create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Glace_Bay create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Godthab create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Goose_Bay create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Grand_Turk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Grenada create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Guadeloupe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Guatemala create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Guayaquil create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Guyana create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Halifax create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Havana create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Hermosillo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Knox create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Marengo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Petersburg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Tell_City create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Vevay create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Vincennes create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indiana/Winamac create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Indianapolis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Inuvik create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Iqaluit create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Jamaica create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Jujuy create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Juneau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Kentucky/Louisville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Kentucky/Monticello create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Knox_IN create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Kralendijk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/La_Paz create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Lima create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Los_Angeles create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Louisville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Lower_Princes create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Maceio create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Managua create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Manaus create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Marigot create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Martinique create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Matamoros create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Mazatlan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Mendoza create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Menominee create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Merida create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Metlakatla create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Mexico_City create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Miquelon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Moncton create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Monterrey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Montevideo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Montreal create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Montserrat create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Nassau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/New_York create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Nipigon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Nome create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Noronha create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/North_Dakota/Center create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Ojinaga create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Panama create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Pangnirtung create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Paramaribo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Phoenix create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Port-au-Prince create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Port_of_Spain create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Porto_Acre create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Porto_Velho create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Puerto_Rico create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Rainy_River create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Rankin_Inlet create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Recife create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Regina create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Resolute create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Rio_Branco create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Rosario create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Santa_Isabel create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Santarem create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Santiago create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Santo_Domingo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Sao_Paulo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Scoresbysund create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Shiprock create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Sitka create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Barthelemy create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Johns create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Kitts create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Lucia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Thomas create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/St_Vincent create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Swift_Current create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Tegucigalpa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Thule create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Thunder_Bay create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Tijuana create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Toronto create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Tortola create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Vancouver create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Virgin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Whitehorse create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Winnipeg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Yakutat create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/America/Yellowknife create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Casey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Davis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Macquarie create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Mawson create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/McMurdo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Palmer create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Rothera create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/South_Pole create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Syowa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Troll create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Antarctica/Vostok create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Arctic/Longyearbyen create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aden create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Almaty create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Amman create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Anadyr create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aqtau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Aqtobe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ashgabat create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ashkhabad create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Baghdad create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Bahrain create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Baku create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Bangkok create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Barnaul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Beirut create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Bishkek create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Brunei create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Calcutta create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Chita create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Choibalsan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Chongqing create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Chungking create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Colombo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dacca create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Damascus create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dhaka create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dili create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dubai create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Dushanbe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Gaza create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Harbin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Hebron create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Hong_Kong create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Hovd create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Irkutsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Istanbul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Jakarta create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Jayapura create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Jerusalem create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kabul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kamchatka create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Karachi create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kashgar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kathmandu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Katmandu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Khandyga create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kolkata create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kuching create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Kuwait create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Macao create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Macau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Magadan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Makassar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Manila create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Muscat create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Nicosia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Novokuznetsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Novosibirsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Omsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Oral create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Phnom_Penh create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Pontianak create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Pyongyang create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Qatar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Qyzylorda create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Rangoon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Riyadh create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Saigon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Sakhalin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Samarkand create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Seoul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Shanghai create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Singapore create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Srednekolymsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Taipei create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tashkent create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tbilisi create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tehran create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tel_Aviv create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Thimbu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Thimphu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tokyo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Tomsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ulan_Bator create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Urumqi create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Ust-Nera create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Vientiane create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Vladivostok create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Yakutsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Yekaterinburg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Asia/Yerevan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Azores create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Bermuda create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Canary create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Faeroe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Faroe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Madeira create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Reykjavik create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/South_Georgia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/St_Helena create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Atlantic/Stanley create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/ACT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Adelaide create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Brisbane create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Broken_Hill create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Canberra create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Currie create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Darwin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Eucla create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Hobart create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/LHI create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Lindeman create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Lord_Howe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Melbourne create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/NSW create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/North create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Perth create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Queensland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/South create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Sydney create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Tasmania create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Victoria create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/West create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Australia/Yancowinna create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/Acre create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/DeNoronha create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/East create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Brazil/West create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/CET create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/CST6CDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Atlantic create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Central create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Eastern create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Mountain create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Newfoundland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Pacific create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Saskatchewan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Canada/Yukon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Chile/Continental create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Chile/EasterIsland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Cuba create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/EET create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/EST create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/EST5EDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Egypt create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Eire create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+1 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+10 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+11 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+12 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+2 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+3 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+4 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+5 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+6 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+7 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+8 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT+9 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-1 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-10 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-11 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-12 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-13 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-14 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-2 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-3 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-4 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-5 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-6 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-7 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-8 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT-9 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/GMT0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/Greenwich create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/UCT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/UTC create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/Universal create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Etc/Zulu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Amsterdam create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Andorra create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Astrakhan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Athens create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Belfast create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Belgrade create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Berlin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Bratislava create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Brussels create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Bucharest create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Budapest create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Busingen create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Chisinau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Copenhagen create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Dublin create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Gibraltar create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Guernsey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Helsinki create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Isle_of_Man create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Istanbul create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Jersey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Kaliningrad create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Kiev create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Kirov create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Lisbon create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Ljubljana create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/London create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Luxembourg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Madrid create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Malta create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Mariehamn create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Minsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Monaco create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Moscow create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Nicosia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Oslo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Paris create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Podgorica create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Prague create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Riga create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Rome create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Samara create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/San_Marino create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Sarajevo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Simferopol create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Skopje create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Sofia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Stockholm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Tallinn create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Tirane create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Tiraspol create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Ulyanovsk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Uzhgorod create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Vaduz create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Vatican create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Vienna create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Vilnius create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Volgograd create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Warsaw create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Zagreb create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Zaporozhye create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Europe/Zurich create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GB create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GB-Eire create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GMT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GMT+0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GMT-0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/GMT0 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Greenwich create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/HST create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Hongkong create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Iceland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Antananarivo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Chagos create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Christmas create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Cocos create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Comoro create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Kerguelen create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Mahe create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Maldives create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Mauritius create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Mayotte create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Indian/Reunion create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Iran create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Israel create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Jamaica create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Japan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Kwajalein create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Libya create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/MET create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/MST create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/MST7MDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Mexico/BajaNorte create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Mexico/BajaSur create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Mexico/General create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/NZ create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/NZ-CHAT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Navajo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/PRC create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/PST8PDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Apia create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Auckland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Bougainville create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Chatham create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Chuuk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Easter create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Efate create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Enderbury create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Fakaofo create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Fiji create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Funafuti create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Galapagos create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Gambier create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Guadalcanal create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Guam create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Honolulu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Johnston create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Kiritimati create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Kosrae create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Kwajalein create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Majuro create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Marquesas create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Midway create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Nauru create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Niue create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Norfolk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Noumea create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Pago_Pago create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Palau create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Pitcairn create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Pohnpei create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Ponape create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Port_Moresby create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Rarotonga create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Saipan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Samoa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Tahiti create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Tarawa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Tongatapu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Truk create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Wake create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Wallis create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Pacific/Yap create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Poland create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Portugal create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/ROC create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/ROK create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Singapore create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/AST4 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/AST4ADT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/CST6 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/CST6CDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/EST5 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/EST5EDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/HST10 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/MST7 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/MST7MDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/PST8 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/PST8PDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/YST9 create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/SystemV/YST9YDT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Turkey create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/UCT create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Alaska create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Aleutian create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Arizona create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Central create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/East-Indiana create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Eastern create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Hawaii create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Indiana-Starke create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Michigan create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Mountain create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Pacific create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Pacific-New create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/US/Samoa create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/UTC create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Universal create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/W-SU create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/WET create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/tzdata/Zulu create mode 100644 flaskwebproject/FlaskWebenv/tcl/tcl8.6/word.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/bgerror.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/button.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/choosedir.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/clrpick.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/comdlg.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/console.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/README create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/anilabel.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/aniwave.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/arrow.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/bind.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/bitmap.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/browse create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/button.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/check.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/clrpick.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/colors.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/combo.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/cscroll.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ctext.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/dialog1.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/dialog2.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/en.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/entry1.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/entry2.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/entry3.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/filebox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/fontchoose.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/form.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/hello create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/hscale.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/icon.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/image1.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/image2.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/earthris.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/flagdown.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/flagup.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/gray25.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/letters.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/noletter.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/pattern.xbm create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/images/tcllogo.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/items.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ixset create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/knightstour.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/label.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/labelframe.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/license.terms create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/mclist.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/menu.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/menubu.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/msgbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/nl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/paned1.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/paned2.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/pendulum.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/plot.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/puzzle.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/radio.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/rmt create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/rolodex create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ruler.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/sayings.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/search.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/spin.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/square create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/states.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/style.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/tclIndex create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/tcolor create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/text.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/textpeer.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/timer create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/toolbar.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/tree.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttkbut.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttkmenu.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttknote.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttkpane.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttkprogress.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/ttkscale.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/twind.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/unicodeout.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/vscale.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/demos/widget create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/dialog.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/entry.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/focus.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/fontchooser.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/iconlist.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/icons.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/README create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/logo.eps create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/logo100.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/logo64.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/logoLarge.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/logoMed.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo.eps create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo100.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo150.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo175.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo200.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/pwrdLogo75.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/images/tai-ku.gif create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/license.terms create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/listbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/megawidget.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/menu.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/mkpsenc.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/cs.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/da.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/de.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/el.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/en.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/en_gb.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/eo.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/es.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/fr.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/hu.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/it.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/nl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/pl.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/pt.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/ru.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/msgs/sv.msg create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/obsolete.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/optMenu.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/palette.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/panedwindow.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/pkgIndex.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/safetk.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/scale.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/scrlbar.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/spinbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/tclIndex create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/tearoff.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/text.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/tk.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/tkfbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/altTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/aquaTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/button.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/clamTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/classicTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/combobox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/cursors.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/defaults.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/entry.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/fonts.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/menubutton.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/notebook.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/panedwindow.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/progress.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/scale.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/scrollbar.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/sizegrip.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/spinbox.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/treeview.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/ttk.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/utils.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/vistaTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/winTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/ttk/xpTheme.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/unsupported.tcl create mode 100644 flaskwebproject/FlaskWebenv/tcl/tk8.6/xmfbox.tcl create mode 100644 flaskwebproject/Lib/encodings/__init__.py create mode 100644 flaskwebproject/Lib/encodings/aliases.py create mode 100644 flaskwebproject/Lib/encodings/ascii.py create mode 100644 flaskwebproject/Lib/encodings/base64_codec.py create mode 100644 flaskwebproject/Lib/encodings/big5.py create mode 100644 flaskwebproject/Lib/encodings/big5hkscs.py create mode 100644 flaskwebproject/Lib/encodings/bz2_codec.py create mode 100644 flaskwebproject/Lib/encodings/charmap.py create mode 100644 flaskwebproject/Lib/encodings/cp037.py create mode 100644 flaskwebproject/Lib/encodings/cp1006.py create mode 100644 flaskwebproject/Lib/encodings/cp1026.py create mode 100644 flaskwebproject/Lib/encodings/cp1125.py create mode 100644 flaskwebproject/Lib/encodings/cp1140.py create mode 100644 flaskwebproject/Lib/encodings/cp1250.py create mode 100644 flaskwebproject/Lib/encodings/cp1251.py create mode 100644 flaskwebproject/Lib/encodings/cp1252.py create mode 100644 flaskwebproject/Lib/encodings/cp1253.py create mode 100644 flaskwebproject/Lib/encodings/cp1254.py create mode 100644 flaskwebproject/Lib/encodings/cp1255.py create mode 100644 flaskwebproject/Lib/encodings/cp1256.py create mode 100644 flaskwebproject/Lib/encodings/cp1257.py create mode 100644 flaskwebproject/Lib/encodings/cp1258.py create mode 100644 flaskwebproject/Lib/encodings/cp273.py create mode 100644 flaskwebproject/Lib/encodings/cp424.py create mode 100644 flaskwebproject/Lib/encodings/cp437.py create mode 100644 flaskwebproject/Lib/encodings/cp500.py create mode 100644 flaskwebproject/Lib/encodings/cp65001.py create mode 100644 flaskwebproject/Lib/encodings/cp720.py create mode 100644 flaskwebproject/Lib/encodings/cp737.py create mode 100644 flaskwebproject/Lib/encodings/cp775.py create mode 100644 flaskwebproject/Lib/encodings/cp850.py create mode 100644 flaskwebproject/Lib/encodings/cp852.py create mode 100644 flaskwebproject/Lib/encodings/cp855.py create mode 100644 flaskwebproject/Lib/encodings/cp856.py create mode 100644 flaskwebproject/Lib/encodings/cp857.py create mode 100644 flaskwebproject/Lib/encodings/cp858.py create mode 100644 flaskwebproject/Lib/encodings/cp860.py create mode 100644 flaskwebproject/Lib/encodings/cp861.py create mode 100644 flaskwebproject/Lib/encodings/cp862.py create mode 100644 flaskwebproject/Lib/encodings/cp863.py create mode 100644 flaskwebproject/Lib/encodings/cp864.py create mode 100644 flaskwebproject/Lib/encodings/cp865.py create mode 100644 flaskwebproject/Lib/encodings/cp866.py create mode 100644 flaskwebproject/Lib/encodings/cp869.py create mode 100644 flaskwebproject/Lib/encodings/cp874.py create mode 100644 flaskwebproject/Lib/encodings/cp875.py create mode 100644 flaskwebproject/Lib/encodings/cp932.py create mode 100644 flaskwebproject/Lib/encodings/cp949.py create mode 100644 flaskwebproject/Lib/encodings/cp950.py create mode 100644 flaskwebproject/Lib/encodings/euc_jis_2004.py create mode 100644 flaskwebproject/Lib/encodings/euc_jisx0213.py create mode 100644 flaskwebproject/Lib/encodings/euc_jp.py create mode 100644 flaskwebproject/Lib/encodings/euc_kr.py create mode 100644 flaskwebproject/Lib/encodings/gb18030.py create mode 100644 flaskwebproject/Lib/encodings/gb2312.py create mode 100644 flaskwebproject/Lib/encodings/gbk.py create mode 100644 flaskwebproject/Lib/encodings/hex_codec.py create mode 100644 flaskwebproject/Lib/encodings/hp_roman8.py create mode 100644 flaskwebproject/Lib/encodings/hz.py create mode 100644 flaskwebproject/Lib/encodings/idna.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp_1.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp_2.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp_2004.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp_3.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_jp_ext.py create mode 100644 flaskwebproject/Lib/encodings/iso2022_kr.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_1.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_10.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_11.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_13.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_14.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_15.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_16.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_2.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_3.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_4.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_5.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_6.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_7.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_8.py create mode 100644 flaskwebproject/Lib/encodings/iso8859_9.py create mode 100644 flaskwebproject/Lib/encodings/johab.py create mode 100644 flaskwebproject/Lib/encodings/koi8_r.py create mode 100644 flaskwebproject/Lib/encodings/koi8_t.py create mode 100644 flaskwebproject/Lib/encodings/koi8_u.py create mode 100644 flaskwebproject/Lib/encodings/kz1048.py create mode 100644 flaskwebproject/Lib/encodings/latin_1.py create mode 100644 flaskwebproject/Lib/encodings/mac_arabic.py create mode 100644 flaskwebproject/Lib/encodings/mac_centeuro.py create mode 100644 flaskwebproject/Lib/encodings/mac_croatian.py create mode 100644 flaskwebproject/Lib/encodings/mac_cyrillic.py create mode 100644 flaskwebproject/Lib/encodings/mac_farsi.py create mode 100644 flaskwebproject/Lib/encodings/mac_greek.py create mode 100644 flaskwebproject/Lib/encodings/mac_iceland.py create mode 100644 flaskwebproject/Lib/encodings/mac_latin2.py create mode 100644 flaskwebproject/Lib/encodings/mac_roman.py create mode 100644 flaskwebproject/Lib/encodings/mac_romanian.py create mode 100644 flaskwebproject/Lib/encodings/mac_turkish.py create mode 100644 flaskwebproject/Lib/encodings/mbcs.py create mode 100644 flaskwebproject/Lib/encodings/oem.py create mode 100644 flaskwebproject/Lib/encodings/palmos.py create mode 100644 flaskwebproject/Lib/encodings/ptcp154.py create mode 100644 flaskwebproject/Lib/encodings/punycode.py create mode 100644 flaskwebproject/Lib/encodings/quopri_codec.py create mode 100644 flaskwebproject/Lib/encodings/raw_unicode_escape.py create mode 100644 flaskwebproject/Lib/encodings/rot_13.py create mode 100644 flaskwebproject/Lib/encodings/shift_jis.py create mode 100644 flaskwebproject/Lib/encodings/shift_jis_2004.py create mode 100644 flaskwebproject/Lib/encodings/shift_jisx0213.py create mode 100644 flaskwebproject/Lib/encodings/tis_620.py create mode 100644 flaskwebproject/Lib/encodings/undefined.py create mode 100644 flaskwebproject/Lib/encodings/unicode_escape.py create mode 100644 flaskwebproject/Lib/encodings/unicode_internal.py create mode 100644 flaskwebproject/Lib/encodings/utf_16.py create mode 100644 flaskwebproject/Lib/encodings/utf_16_be.py create mode 100644 flaskwebproject/Lib/encodings/utf_16_le.py create mode 100644 flaskwebproject/Lib/encodings/utf_32.py create mode 100644 flaskwebproject/Lib/encodings/utf_32_be.py create mode 100644 flaskwebproject/Lib/encodings/utf_32_le.py create mode 100644 flaskwebproject/Lib/encodings/utf_7.py create mode 100644 flaskwebproject/Lib/encodings/utf_8.py create mode 100644 flaskwebproject/Lib/encodings/utf_8_sig.py create mode 100644 flaskwebproject/Lib/encodings/uu_codec.py create mode 100644 flaskwebproject/Lib/encodings/zlib_codec.py create mode 100644 flaskwebproject/Lib/fnmatch.py create mode 100644 flaskwebproject/Lib/genericpath.py create mode 100644 flaskwebproject/Lib/ntpath.py create mode 100644 flaskwebproject/Lib/os.py create mode 100644 flaskwebproject/Lib/posixpath.py create mode 100644 flaskwebproject/README.md create mode 100644 flaskwebproject/migrations/README create mode 100644 flaskwebproject/migrations/alembic.ini create mode 100644 flaskwebproject/migrations/env.py create mode 100644 flaskwebproject/migrations/script.py.mako create mode 100644 flaskwebproject/migrations/versions/d0c0042067ee_initial_revision.py create mode 100644 flaskwebproject/migrations/versions/d2ecd9d1e0a5_secondary_revision.py create mode 100644 flaskwebproject/obj/Debug/FlaskWebProject1.pyproj.CoreCompileInputs.cache create mode 100644 flaskwebproject/obj/Debug/FlaskWebProject1.pyproj.FileListAbsolute.txt create mode 100644 flaskwebproject/old-migrations/README create mode 100644 flaskwebproject/old-migrations/alembic.ini create mode 100644 flaskwebproject/old-migrations/env.py create mode 100644 flaskwebproject/old-migrations/script.py.mako create mode 100644 flaskwebproject/old-migrations/versions/12d1282e5878_update_tables.py create mode 100644 flaskwebproject/old-migrations/versions/290d53d3d79a_json_column_changes.py create mode 100644 flaskwebproject/old-migrations/versions/996b9a5c9829_create_tables.py create mode 100644 flaskwebproject/old-migrations/versions/f758d3dfa2bf_update_tables.py create mode 100644 flaskwebproject/requirements.txt create mode 100644 flaskwebproject/runserver.py create mode 100644 flaskwebproject/setenv.bat create mode 100644 flaskwebproject/webapp.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b0869a --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs/new_dbsync/FileContentIndex +/.vs +*.pyc +*.json +*.DS_Store +*.log +/pyproject.toml +dbsync.log.* +.idea +/log +venv +flaskapp \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1.pyproj b/flaskwebproject/FlaskWebProject1.pyproj new file mode 100644 index 0000000..bf2a0fc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1.pyproj @@ -0,0 +1,125 @@ + + + + 10.0 + Debug + 2.0 + 963d765a-fe55-4d66-b858-e78b037fc474 + . + {789894c7-04a9-4a11-a6b5-3f4435165112};{1b580a1a-fdb3-4b32-83e1-6407eb2722e6};{349c5851-65df-11da-9384-00065b846f21};{888888a0-9f3d-457c-b088-3a5042f75d52} + runserver.py + + + . + Web launcher + http://localhost + . + true + FlaskWebProject1 + FlaskWebProject1 + MSBuild|FlaskWebenv|$(MSBuildProjectFullPath) + + + true + false + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FlaskWebenv + 3.6 + FlaskWebenv (Python 3.6 (64-bit)) + Scripts\python.exe + Scripts\pythonw.exe + PYTHONPATH + X64 + + + + + + + + + + + + + True + True + http://localhost + False + + + + + + + CurrentPage + True + False + False + False + + + + + + + + + False + False + + + + + \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1.pyproj.user b/flaskwebproject/FlaskWebProject1.pyproj.user new file mode 100644 index 0000000..863bc50 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1.pyproj.user @@ -0,0 +1,7 @@ + + + + Debug|Any CPU + ShowAllFiles + + \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/Include/Python-ast.h b/flaskwebproject/FlaskWebProject1/Include/Python-ast.h new file mode 100644 index 0000000..70494b7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/Python-ast.h @@ -0,0 +1,637 @@ +/* File automatically generated by Parser/asdl_c.py. */ + +#include "asdl.h" + +typedef struct _mod *mod_ty; + +typedef struct _stmt *stmt_ty; + +typedef struct _expr *expr_ty; + +typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, + Param=6 } expr_context_ty; + +typedef struct _slice *slice_ty; + +typedef enum _boolop { And=1, Or=2 } boolop_ty; + +typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7, + LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12, + FloorDiv=13 } operator_ty; + +typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; + +typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, + In=9, NotIn=10 } cmpop_ty; + +typedef struct _comprehension *comprehension_ty; + +typedef struct _excepthandler *excepthandler_ty; + +typedef struct _arguments *arguments_ty; + +typedef struct _arg *arg_ty; + +typedef struct _keyword *keyword_ty; + +typedef struct _alias *alias_ty; + +typedef struct _withitem *withitem_ty; + + +enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, + Suite_kind=4}; +struct _mod { + enum _mod_kind kind; + union { + struct { + asdl_seq *body; + } Module; + + struct { + asdl_seq *body; + } Interactive; + + struct { + expr_ty body; + } Expression; + + struct { + asdl_seq *body; + } Suite; + + } v; +}; + +enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_kind=3, + Return_kind=4, Delete_kind=5, Assign_kind=6, + AugAssign_kind=7, AnnAssign_kind=8, For_kind=9, + AsyncFor_kind=10, While_kind=11, If_kind=12, With_kind=13, + AsyncWith_kind=14, Raise_kind=15, Try_kind=16, + Assert_kind=17, Import_kind=18, ImportFrom_kind=19, + Global_kind=20, Nonlocal_kind=21, Expr_kind=22, Pass_kind=23, + Break_kind=24, Continue_kind=25}; +struct _stmt { + enum _stmt_kind kind; + union { + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + expr_ty returns; + } FunctionDef; + + struct { + identifier name; + arguments_ty args; + asdl_seq *body; + asdl_seq *decorator_list; + expr_ty returns; + } AsyncFunctionDef; + + struct { + identifier name; + asdl_seq *bases; + asdl_seq *keywords; + asdl_seq *body; + asdl_seq *decorator_list; + } ClassDef; + + struct { + expr_ty value; + } Return; + + struct { + asdl_seq *targets; + } Delete; + + struct { + asdl_seq *targets; + expr_ty value; + } Assign; + + struct { + expr_ty target; + operator_ty op; + expr_ty value; + } AugAssign; + + struct { + expr_ty target; + expr_ty annotation; + expr_ty value; + int simple; + } AnnAssign; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } For; + + struct { + expr_ty target; + expr_ty iter; + asdl_seq *body; + asdl_seq *orelse; + } AsyncFor; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } While; + + struct { + expr_ty test; + asdl_seq *body; + asdl_seq *orelse; + } If; + + struct { + asdl_seq *items; + asdl_seq *body; + } With; + + struct { + asdl_seq *items; + asdl_seq *body; + } AsyncWith; + + struct { + expr_ty exc; + expr_ty cause; + } Raise; + + struct { + asdl_seq *body; + asdl_seq *handlers; + asdl_seq *orelse; + asdl_seq *finalbody; + } Try; + + struct { + expr_ty test; + expr_ty msg; + } Assert; + + struct { + asdl_seq *names; + } Import; + + struct { + identifier module; + asdl_seq *names; + int level; + } ImportFrom; + + struct { + asdl_seq *names; + } Global; + + struct { + asdl_seq *names; + } Nonlocal; + + struct { + expr_ty value; + } Expr; + + } v; + int lineno; + int col_offset; +}; + +enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4, + IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8, + SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11, + Await_kind=12, Yield_kind=13, YieldFrom_kind=14, + Compare_kind=15, Call_kind=16, Num_kind=17, Str_kind=18, + FormattedValue_kind=19, JoinedStr_kind=20, Bytes_kind=21, + NameConstant_kind=22, Ellipsis_kind=23, Constant_kind=24, + Attribute_kind=25, Subscript_kind=26, Starred_kind=27, + Name_kind=28, List_kind=29, Tuple_kind=30}; +struct _expr { + enum _expr_kind kind; + union { + struct { + boolop_ty op; + asdl_seq *values; + } BoolOp; + + struct { + expr_ty left; + operator_ty op; + expr_ty right; + } BinOp; + + struct { + unaryop_ty op; + expr_ty operand; + } UnaryOp; + + struct { + arguments_ty args; + expr_ty body; + } Lambda; + + struct { + expr_ty test; + expr_ty body; + expr_ty orelse; + } IfExp; + + struct { + asdl_seq *keys; + asdl_seq *values; + } Dict; + + struct { + asdl_seq *elts; + } Set; + + struct { + expr_ty elt; + asdl_seq *generators; + } ListComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } SetComp; + + struct { + expr_ty key; + expr_ty value; + asdl_seq *generators; + } DictComp; + + struct { + expr_ty elt; + asdl_seq *generators; + } GeneratorExp; + + struct { + expr_ty value; + } Await; + + struct { + expr_ty value; + } Yield; + + struct { + expr_ty value; + } YieldFrom; + + struct { + expr_ty left; + asdl_int_seq *ops; + asdl_seq *comparators; + } Compare; + + struct { + expr_ty func; + asdl_seq *args; + asdl_seq *keywords; + } Call; + + struct { + object n; + } Num; + + struct { + string s; + } Str; + + struct { + expr_ty value; + int conversion; + expr_ty format_spec; + } FormattedValue; + + struct { + asdl_seq *values; + } JoinedStr; + + struct { + bytes s; + } Bytes; + + struct { + singleton value; + } NameConstant; + + struct { + constant value; + } Constant; + + struct { + expr_ty value; + identifier attr; + expr_context_ty ctx; + } Attribute; + + struct { + expr_ty value; + slice_ty slice; + expr_context_ty ctx; + } Subscript; + + struct { + expr_ty value; + expr_context_ty ctx; + } Starred; + + struct { + identifier id; + expr_context_ty ctx; + } Name; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } List; + + struct { + asdl_seq *elts; + expr_context_ty ctx; + } Tuple; + + } v; + int lineno; + int col_offset; +}; + +enum _slice_kind {Slice_kind=1, ExtSlice_kind=2, Index_kind=3}; +struct _slice { + enum _slice_kind kind; + union { + struct { + expr_ty lower; + expr_ty upper; + expr_ty step; + } Slice; + + struct { + asdl_seq *dims; + } ExtSlice; + + struct { + expr_ty value; + } Index; + + } v; +}; + +struct _comprehension { + expr_ty target; + expr_ty iter; + asdl_seq *ifs; + int is_async; +}; + +enum _excepthandler_kind {ExceptHandler_kind=1}; +struct _excepthandler { + enum _excepthandler_kind kind; + union { + struct { + expr_ty type; + identifier name; + asdl_seq *body; + } ExceptHandler; + + } v; + int lineno; + int col_offset; +}; + +struct _arguments { + asdl_seq *args; + arg_ty vararg; + asdl_seq *kwonlyargs; + asdl_seq *kw_defaults; + arg_ty kwarg; + asdl_seq *defaults; +}; + +struct _arg { + identifier arg; + expr_ty annotation; + int lineno; + int col_offset; +}; + +struct _keyword { + identifier arg; + expr_ty value; +}; + +struct _alias { + identifier name; + identifier asname; +}; + +struct _withitem { + expr_ty context_expr; + expr_ty optional_vars; +}; + + +#define Module(a0, a1) _Py_Module(a0, a1) +mod_ty _Py_Module(asdl_seq * body, PyArena *arena); +#define Interactive(a0, a1) _Py_Interactive(a0, a1) +mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); +#define Expression(a0, a1) _Py_Expression(a0, a1) +mod_ty _Py_Expression(expr_ty body, PyArena *arena); +#define Suite(a0, a1) _Py_Suite(a0, a1) +mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); +#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, + asdl_seq * decorator_list, expr_ty returns, int lineno, + int col_offset, PyArena *arena); +#define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * + body, asdl_seq * decorator_list, expr_ty returns, + int lineno, int col_offset, PyArena *arena); +#define ClassDef(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, + asdl_seq * body, asdl_seq * decorator_list, int lineno, + int col_offset, PyArena *arena); +#define Return(a0, a1, a2, a3) _Py_Return(a0, a1, a2, a3) +stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Delete(a0, a1, a2, a3) _Py_Delete(a0, a1, a2, a3) +stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, PyArena + *arena); +#define Assign(a0, a1, a2, a3, a4) _Py_Assign(a0, a1, a2, a3, a4) +stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int + col_offset, PyArena *arena); +#define AugAssign(a0, a1, a2, a3, a4, a5) _Py_AugAssign(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int + lineno, int col_offset, PyArena *arena); +#define AnnAssign(a0, a1, a2, a3, a4, a5, a6) _Py_AnnAssign(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int + simple, int lineno, int col_offset, PyArena *arena); +#define For(a0, a1, a2, a3, a4, a5, a6) _Py_For(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define AsyncFor(a0, a1, a2, a3, a4, a5, a6) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * + orelse, int lineno, int col_offset, PyArena *arena); +#define While(a0, a1, a2, a3, a4, a5) _Py_While(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + int col_offset, PyArena *arena); +#define With(a0, a1, a2, a3, a4) _Py_With(a0, a1, a2, a3, a4) +stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, + PyArena *arena); +#define AsyncWith(a0, a1, a2, a3, a4) _Py_AsyncWith(a0, a1, a2, a3, a4) +stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int + col_offset, PyArena *arena); +#define Raise(a0, a1, a2, a3, a4) _Py_Raise(a0, a1, a2, a3, a4) +stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, + PyArena *arena); +#define Try(a0, a1, a2, a3, a4, a5, a6) _Py_Try(a0, a1, a2, a3, a4, a5, a6) +stmt_ty _Py_Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, + asdl_seq * finalbody, int lineno, int col_offset, PyArena + *arena); +#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4) +stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, + PyArena *arena); +#define Import(a0, a1, a2, a3) _Py_Import(a0, a1, a2, a3) +stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define ImportFrom(a0, a1, a2, a3, a4, a5) _Py_ImportFrom(a0, a1, a2, a3, a4, a5) +stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int + lineno, int col_offset, PyArena *arena); +#define Global(a0, a1, a2, a3) _Py_Global(a0, a1, a2, a3) +stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Nonlocal(a0, a1, a2, a3) _Py_Nonlocal(a0, a1, a2, a3) +stmt_ty _Py_Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena + *arena); +#define Expr(a0, a1, a2, a3) _Py_Expr(a0, a1, a2, a3) +stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Pass(a0, a1, a2) _Py_Pass(a0, a1, a2) +stmt_ty _Py_Pass(int lineno, int col_offset, PyArena *arena); +#define Break(a0, a1, a2) _Py_Break(a0, a1, a2) +stmt_ty _Py_Break(int lineno, int col_offset, PyArena *arena); +#define Continue(a0, a1, a2) _Py_Continue(a0, a1, a2) +stmt_ty _Py_Continue(int lineno, int col_offset, PyArena *arena); +#define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4) +expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +#define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int + col_offset, PyArena *arena); +#define UnaryOp(a0, a1, a2, a3, a4) _Py_UnaryOp(a0, a1, a2, a3, a4) +expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, + PyArena *arena); +#define Lambda(a0, a1, a2, a3, a4) _Py_Lambda(a0, a1, a2, a3, a4) +expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, + PyArena *arena); +#define IfExp(a0, a1, a2, a3, a4, a5) _Py_IfExp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int + col_offset, PyArena *arena); +#define Dict(a0, a1, a2, a3, a4) _Py_Dict(a0, a1, a2, a3, a4) +expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int + col_offset, PyArena *arena); +#define Set(a0, a1, a2, a3) _Py_Set(a0, a1, a2, a3) +expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena); +#define ListComp(a0, a1, a2, a3, a4) _Py_ListComp(a0, a1, a2, a3, a4) +expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define SetComp(a0, a1, a2, a3, a4) _Py_SetComp(a0, a1, a2, a3, a4) +expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define DictComp(a0, a1, a2, a3, a4, a5) _Py_DictComp(a0, a1, a2, a3, a4, a5) +expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int + lineno, int col_offset, PyArena *arena); +#define GeneratorExp(a0, a1, a2, a3, a4) _Py_GeneratorExp(a0, a1, a2, a3, a4) +expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +#define Await(a0, a1, a2, a3) _Py_Await(a0, a1, a2, a3) +expr_ty _Py_Await(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3) +expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena); +#define YieldFrom(a0, a1, a2, a3) _Py_YieldFrom(a0, a1, a2, a3) +expr_ty _Py_YieldFrom(expr_ty value, int lineno, int col_offset, PyArena + *arena); +#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, + int lineno, int col_offset, PyArena *arena); +#define Call(a0, a1, a2, a3, a4, a5) _Py_Call(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int + lineno, int col_offset, PyArena *arena); +#define Num(a0, a1, a2, a3) _Py_Num(a0, a1, a2, a3) +expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena); +#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3) +expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena); +#define FormattedValue(a0, a1, a2, a3, a4, a5) _Py_FormattedValue(a0, a1, a2, a3, a4, a5) +expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, + int lineno, int col_offset, PyArena *arena); +#define JoinedStr(a0, a1, a2, a3) _Py_JoinedStr(a0, a1, a2, a3) +expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena + *arena); +#define Bytes(a0, a1, a2, a3) _Py_Bytes(a0, a1, a2, a3) +expr_ty _Py_Bytes(bytes s, int lineno, int col_offset, PyArena *arena); +#define NameConstant(a0, a1, a2, a3) _Py_NameConstant(a0, a1, a2, a3) +expr_ty _Py_NameConstant(singleton value, int lineno, int col_offset, PyArena + *arena); +#define Ellipsis(a0, a1, a2) _Py_Ellipsis(a0, a1, a2) +expr_ty _Py_Ellipsis(int lineno, int col_offset, PyArena *arena); +#define Constant(a0, a1, a2, a3) _Py_Constant(a0, a1, a2, a3) +expr_ty _Py_Constant(constant value, int lineno, int col_offset, PyArena + *arena); +#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Subscript(a0, a1, a2, a3, a4, a5) _Py_Subscript(a0, a1, a2, a3, a4, a5) +expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int + lineno, int col_offset, PyArena *arena); +#define Starred(a0, a1, a2, a3, a4) _Py_Starred(a0, a1, a2, a3, a4) +expr_ty _Py_Starred(expr_ty value, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Name(a0, a1, a2, a3, a4) _Py_Name(a0, a1, a2, a3, a4) +expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define List(a0, a1, a2, a3, a4) _Py_List(a0, a1, a2, a3, a4) +expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Tuple(a0, a1, a2, a3, a4) _Py_Tuple(a0, a1, a2, a3, a4) +expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena); +#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) +slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) +slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); +#define Index(a0, a1) _Py_Index(a0, a1) +slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) +comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * + ifs, int is_async, PyArena *arena); +#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5) +excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq * + body, int lineno, int col_offset, PyArena + *arena); +#define arguments(a0, a1, a2, a3, a4, a5, a6) _Py_arguments(a0, a1, a2, a3, a4, a5, a6) +arguments_ty _Py_arguments(asdl_seq * args, arg_ty vararg, asdl_seq * + kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, + asdl_seq * defaults, PyArena *arena); +#define arg(a0, a1, a2, a3, a4) _Py_arg(a0, a1, a2, a3, a4) +arg_ty _Py_arg(identifier arg, expr_ty annotation, int lineno, int col_offset, + PyArena *arena); +#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) +keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define alias(a0, a1, a2) _Py_alias(a0, a1, a2) +alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); +#define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) +withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena + *arena); + +PyObject* PyAST_mod2obj(mod_ty t); +mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +int PyAST_Check(PyObject* obj); diff --git a/flaskwebproject/FlaskWebProject1/Include/Python.h b/flaskwebproject/FlaskWebProject1/Include/Python.h new file mode 100644 index 0000000..6177bad --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/Python.h @@ -0,0 +1,139 @@ +#ifndef Py_PYTHON_H +#define Py_PYTHON_H +/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ + +/* Include nearly all Python header files */ + +#include "patchlevel.h" +#include "pyconfig.h" +#include "pymacconfig.h" + +#include + +#ifndef UCHAR_MAX +#error "Something's broken. UCHAR_MAX should be defined in limits.h." +#endif + +#if UCHAR_MAX != 255 +#error "Python's source code assumes C's unsigned char is an 8-bit type." +#endif + +#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE) +#define _SGI_MP_SOURCE +#endif + +#include +#ifndef NULL +# error "Python.h requires that stdio.h define NULL." +#endif + +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_CRYPT_H +#include +#endif + +/* For size_t? */ +#ifdef HAVE_STDDEF_H +#include +#endif + +/* CAUTION: Build setups should ensure that NDEBUG is defined on the + * compiler command line when building Python in release mode; else + * assert() calls won't be removed. + */ +#include + +#include "pyport.h" +#include "pymacro.h" + +#include "pyatomic.h" + +/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. + * PYMALLOC_DEBUG is in error if pymalloc is not in use. + */ +#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) +#define PYMALLOC_DEBUG +#endif +#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) +#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" +#endif +#include "pymath.h" +#include "pytime.h" +#include "pymem.h" + +#include "object.h" +#include "objimpl.h" +#include "typeslots.h" +#include "pyhash.h" + +#include "pydebug.h" + +#include "bytearrayobject.h" +#include "bytesobject.h" +#include "unicodeobject.h" +#include "longobject.h" +#include "longintrepr.h" +#include "boolobject.h" +#include "floatobject.h" +#include "complexobject.h" +#include "rangeobject.h" +#include "memoryobject.h" +#include "tupleobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "odictobject.h" +#include "enumobject.h" +#include "setobject.h" +#include "methodobject.h" +#include "moduleobject.h" +#include "funcobject.h" +#include "classobject.h" +#include "fileobject.h" +#include "pycapsule.h" +#include "traceback.h" +#include "sliceobject.h" +#include "cellobject.h" +#include "iterobject.h" +#include "genobject.h" +#include "descrobject.h" +#include "warnings.h" +#include "weakrefobject.h" +#include "structseq.h" +#include "namespaceobject.h" + +#include "codecs.h" +#include "pyerrors.h" + +#include "pystate.h" + +#include "pyarena.h" +#include "modsupport.h" +#include "pythonrun.h" +#include "pylifecycle.h" +#include "ceval.h" +#include "sysmodule.h" +#include "osmodule.h" +#include "intrcheck.h" +#include "import.h" + +#include "abstract.h" +#include "bltinmodule.h" + +#include "compile.h" +#include "eval.h" + +#include "pyctype.h" +#include "pystrtod.h" +#include "pystrcmp.h" +#include "dtoa.h" +#include "fileutils.h" +#include "pyfpe.h" + +#endif /* !Py_PYTHON_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/abstract.h b/flaskwebproject/FlaskWebProject1/Include/abstract.h new file mode 100644 index 0000000..6bb76ec --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/abstract.h @@ -0,0 +1,1377 @@ +#ifndef Py_ABSTRACTOBJECT_H +#define Py_ABSTRACTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PY_SSIZE_T_CLEAN +#define PyObject_CallFunction _PyObject_CallFunction_SizeT +#define PyObject_CallMethod _PyObject_CallMethod_SizeT +#ifndef Py_LIMITED_API +#define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT +#endif /* !Py_LIMITED_API */ +#endif + +/* Abstract Object Interface (many thanks to Jim Fulton) */ + +/* + PROPOSAL: A Generic Python Object Interface for Python C Modules + +Problem + + Python modules written in C that must access Python objects must do + so through routines whose interfaces are described by a set of + include files. Unfortunately, these routines vary according to the + object accessed. To use these routines, the C programmer must check + the type of the object being used and must call a routine based on + the object type. For example, to access an element of a sequence, + the programmer must determine whether the sequence is a list or a + tuple: + + if(is_tupleobject(o)) + e=gettupleitem(o,i) + else if(is_listitem(o)) + e=getlistitem(o,i) + + If the programmer wants to get an item from another type of object + that provides sequence behavior, there is no clear way to do it + correctly. + + The persistent programmer may peruse object.h and find that the + _typeobject structure provides a means of invoking up to (currently + about) 41 special operators. So, for example, a routine can get an + item from any object that provides sequence behavior. However, to + use this mechanism, the programmer must make their code dependent on + the current Python implementation. + + Also, certain semantics, especially memory management semantics, may + differ by the type of object being used. Unfortunately, these + semantics are not clearly described in the current include files. + An abstract interface providing more consistent semantics is needed. + +Proposal + + I propose the creation of a standard interface (with an associated + library of routines and/or macros) for generically obtaining the + services of Python objects. This proposal can be viewed as one + components of a Python C interface consisting of several components. + + From the viewpoint of C access to Python services, we have (as + suggested by Guido in off-line discussions): + + - "Very high level layer": two or three functions that let you exec or + eval arbitrary Python code given as a string in a module whose name is + given, passing C values in and getting C values out using + mkvalue/getargs style format strings. This does not require the user + to declare any variables of type "PyObject *". This should be enough + to write a simple application that gets Python code from the user, + execs it, and returns the output or errors. (Error handling must also + be part of this API.) + + - "Abstract objects layer": which is the subject of this proposal. + It has many functions operating on objects, and lest you do many + things from C that you can also write in Python, without going + through the Python parser. + + - "Concrete objects layer": This is the public type-dependent + interface provided by the standard built-in types, such as floats, + strings, and lists. This interface exists and is currently + documented by the collection of include files provided with the + Python distributions. + + From the point of view of Python accessing services provided by C + modules: + + - "Python module interface": this interface consist of the basic + routines used to define modules and their members. Most of the + current extensions-writing guide deals with this interface. + + - "Built-in object interface": this is the interface that a new + built-in type must provide and the mechanisms and rules that a + developer of a new built-in type must use and follow. + + This proposal is a "first-cut" that is intended to spur + discussion. See especially the lists of notes. + + The Python C object interface will provide four protocols: object, + numeric, sequence, and mapping. Each protocol consists of a + collection of related operations. If an operation that is not + provided by a particular type is invoked, then a standard exception, + NotImplementedError is raised with an operation name as an argument. + In addition, for convenience this interface defines a set of + constructors for building objects of built-in types. This is needed + so new objects can be returned from C functions that otherwise treat + objects generically. + +Memory Management + + For all of the functions described in this proposal, if a function + retains a reference to a Python object passed as an argument, then the + function will increase the reference count of the object. It is + unnecessary for the caller to increase the reference count of an + argument in anticipation of the object's retention. + + All Python objects returned from functions should be treated as new + objects. Functions that return objects assume that the caller will + retain a reference and the reference count of the object has already + been incremented to account for this fact. A caller that does not + retain a reference to an object that is returned from a function + must decrement the reference count of the object (using + DECREF(object)) to prevent memory leaks. + + Note that the behavior mentioned here is different from the current + behavior for some objects (e.g. lists and tuples) when certain + type-specific routines are called directly (e.g. setlistitem). The + proposed abstraction layer will provide a consistent memory + management interface, correcting for inconsistent behavior for some + built-in types. + +Protocols + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ + +/* Object Protocol: */ + + /* Implemented elsewhere: + + int PyObject_Print(PyObject *o, FILE *fp, int flags); + + Print an object, o, on file, fp. Returns -1 on + error. The flags argument is used to enable certain printing + options. The only option currently supported is Py_Print_RAW. + + (What should be said about Py_Print_RAW?) + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttrString(PyObject *o, const char *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + /* Implemented elsewhere: + + int PyObject_HasAttr(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: + hasattr(o,attr_name). + + This function always succeeds. + + */ + + /* Implemented elsewhere: + + PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + This is the equivalent of the Python expression: o.attr_name. + + */ + + + /* Implemented elsewhere: + + int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value v. Raise an exception and return -1 on failure; return 0 on + success. This is the equivalent of the Python statement o.attr_name=v. + + */ + + /* Implemented elsewhere: + + int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object o, + to the value v. Raise an exception and return -1 on failure; return 0 on + success. This is the equivalent of the Python statement o.attr_name=v. + + */ + + /* implemented as a macro: + + int PyObject_DelAttrString(PyObject *o, const char *attr_name); + + Delete attribute named attr_name, for object o. Returns + -1 on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttrString(O,A) PyObject_SetAttrString((O),(A),NULL) + + /* implemented as a macro: + + int PyObject_DelAttr(PyObject *o, PyObject *attr_name); + + Delete attribute named attr_name, for object o. Returns -1 + on failure. This is the equivalent of the Python + statement: del o.attr_name. + + */ +#define PyObject_DelAttr(O,A) PyObject_SetAttr((O),(A),NULL) + + /* Implemented elsewhere: + + PyObject *PyObject_Repr(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: repr(o). + + Called by the repr() built-in function. + + */ + + /* Implemented elsewhere: + + PyObject *PyObject_Str(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. This is + the equivalent of the Python expression: str(o).) + + Called by the str() and print() built-in functions. + + */ + + /* Declared elsewhere + + PyAPI_FUNC(int) PyCallable_Check(PyObject *o); + + Determine if the object, o, is callable. Return 1 if the + object is callable and 0 otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable_object, + PyObject *args, PyObject *kwargs); + + /* + Call a callable Python object, callable_object, with + arguments and keywords arguments. The 'args' argument can not be + NULL. + */ + +#ifndef Py_LIMITED_API + PyAPI_FUNC(PyObject*) _PyStack_AsTuple( + PyObject **stack, + Py_ssize_t nargs); + + /* Convert keyword arguments from the (stack, kwnames) format to a Python + dictionary. + + kwnames must only contains str strings, no subclass, and all keys must + be unique. kwnames is not checked, usually these checks are done before or later + calling _PyStack_AsDict(). For example, _PyArg_ParseStack() raises an + error if a key is not a string. */ + PyAPI_FUNC(PyObject *) _PyStack_AsDict( + PyObject **values, + PyObject *kwnames); + + /* Convert (args, nargs, kwargs: dict) into (stack, nargs, kwnames: tuple). + + Return 0 on success, raise an exception and return -1 on error. + + Write the new stack into *p_stack. If *p_stack is differen than args, it + must be released by PyMem_Free(). + + The stack uses borrowed references. + + The type of keyword keys is not checked, these checks should be done + later (ex: _PyArg_ParseStackAndKeywords). */ + PyAPI_FUNC(int) _PyStack_UnpackDict( + PyObject **args, + Py_ssize_t nargs, + PyObject *kwargs, + PyObject ***p_stack, + PyObject **p_kwnames); + + /* Call the callable object func with the "fast call" calling convention: + args is a C array for positional arguments (nargs is the number of + positional arguments), kwargs is a dictionary for keyword arguments. + + If nargs is equal to zero, args can be NULL. kwargs can be NULL. + nargs must be greater or equal to zero. + + Return the result on success. Raise an exception on return NULL on + error. */ + PyAPI_FUNC(PyObject *) _PyObject_FastCallDict(PyObject *func, + PyObject **args, Py_ssize_t nargs, + PyObject *kwargs); + + /* Call the callable object func with the "fast call" calling convention: + args is a C array for positional arguments followed by values of + keyword arguments. Keys of keyword arguments are stored as a tuple + of strings in kwnames. nargs is the number of positional parameters at + the beginning of stack. The size of kwnames gives the number of keyword + values in the stack after positional arguments. + + kwnames must only contains str strings, no subclass, and all keys must + be unique. + + If nargs is equal to zero and there is no keyword argument (kwnames is + NULL or its size is zero), args can be NULL. + + Return the result on success. Raise an exception and return NULL on + error. */ + PyAPI_FUNC(PyObject *) _PyObject_FastCallKeywords + (PyObject *func, + PyObject **args, + Py_ssize_t nargs, + PyObject *kwnames); + +#define _PyObject_FastCall(func, args, nargs) \ + _PyObject_FastCallDict((func), (args), (nargs), NULL) + +#define _PyObject_CallNoArg(func) \ + _PyObject_FastCall((func), NULL, 0) + +#define _PyObject_CallArg1(func, arg) \ + _PyObject_FastCall((func), &(arg), 1) + + PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(PyObject *func, + PyObject *obj, PyObject *args, + PyObject *kwargs); + + PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *func, + PyObject *result, + const char *where); +#endif /* Py_LIMITED_API */ + + PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable_object, + PyObject *args); + + /* + Call a callable Python object, callable_object, with + arguments given by the tuple, args. If no arguments are + needed, then args may be NULL. Returns the result of the + call on success, or NULL on failure. This is the equivalent + of the Python expression: o(*args). + */ + + PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, + const char *format, ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are described + using a mkvalue-style format string. The format may be NULL, + indicating that no arguments are provided. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: o(*args). + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, + const char *method, + const char *format, ...); + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are described by a mkvalue + format string. The format may be NULL, indicating that no + arguments are provided. Returns the result of the call on + success, or NULL on failure. This is the equivalent of the + Python expression: o.method(args). + */ + +#ifndef Py_LIMITED_API + PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o, + _Py_Identifier *method, + const char *format, ...); + + /* + Like PyObject_CallMethod, but expect a _Py_Identifier* as the + method name. + */ +#endif /* !Py_LIMITED_API */ + + PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, + const char *format, + ...); + PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, + const char *name, + const char *format, + ...); +#ifndef Py_LIMITED_API + PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o, + _Py_Identifier *name, + const char *format, + ...); +#endif /* !Py_LIMITED_API */ + + PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, + ...); + + /* + Call a callable Python object, callable_object, with a + variable number of C arguments. The C arguments are provided + as PyObject * values, terminated by a NULL. Returns the + result of the call on success, or NULL on failure. This is + the equivalent of the Python expression: o(*args). + */ + + + PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o, + PyObject *method, ...); +#ifndef Py_LIMITED_API + PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs(PyObject *o, + struct _Py_Identifier *method, + ...); +#endif /* !Py_LIMITED_API */ + + /* + Call the method named m of object o with a variable number of + C arguments. The C arguments are provided as PyObject * + values, terminated by NULL. Returns the result of the call + on success, or NULL on failure. This is the equivalent of + the Python expression: o.method(args). + */ + + + /* Implemented elsewhere: + + long PyObject_Hash(PyObject *o); + + Compute and return the hash, hash_value, of an object, o. On + failure, return -1. This is the equivalent of the Python + expression: hash(o). + */ + + + /* Implemented elsewhere: + + int PyObject_IsTrue(PyObject *o); + + Returns 1 if the object, o, is considered to be true, 0 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not not o + */ + + /* Implemented elsewhere: + + int PyObject_Not(PyObject *o); + + Returns 0 if the object, o, is considered to be true, 1 if o is + considered to be false and -1 on failure. This is equivalent to the + Python expression: not o + */ + + PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); + + /* + On success, returns a type object corresponding to the object + type of object o. On failure, returns NULL. This is + equivalent to the Python expression: type(o). + */ + + PyAPI_FUNC(Py_ssize_t) PyObject_Size(PyObject *o); + + /* + Return the size of object o. If the object, o, provides + both sequence and mapping protocols, the sequence size is + returned. On error, -1 is returned. This is the equivalent + to the Python expression: len(o). + */ + + /* For DLL compatibility */ +#undef PyObject_Length + PyAPI_FUNC(Py_ssize_t) PyObject_Length(PyObject *o); +#define PyObject_Length PyObject_Size + +#ifndef Py_LIMITED_API + PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); + PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); +#endif + + /* + Guess the size of object o using len(o) or o.__length_hint__(). + If neither of those return a non-negative value, then return the + default value. If one of the calls fails, this function returns -1. + */ + + PyAPI_FUNC(PyObject *) PyObject_GetItem(PyObject *o, PyObject *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + */ + + PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); + + /* + Map the object key to the value v. Raise an exception and return -1 + on failure; return 0 on success. This is the equivalent of the Python + statement o[key]=v. + */ + + PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); + + /* + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ + + PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); + + /* + Delete the mapping for key from *o. Returns -1 on failure. + This is the equivalent of the Python statement: del o[key]. + */ + + /* old buffer API + FIXME: usage of these should all be replaced in Python itself + but for backwards compatibility we will implement them. + Their usage without a corresponding "unlock" mechanism + may create issues (but they would already be there). */ + + PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, + const char **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (character, + single segment) buffer interface and returns a pointer to a + read-only memory location useable as character based input + for subsequent processing. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + */ + + PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); + + /* + Checks whether an arbitrary object supports the (character, + single segment) buffer interface. Returns 1 on success, 0 + on failure. + */ + + PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, + const void **buffer, + Py_ssize_t *buffer_len); + + /* + Same as PyObject_AsCharBuffer() except that this API expects + (readable, single segment) buffer interface and returns a + pointer to a read-only memory location which can contain + arbitrary data. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + */ + + PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, + void **buffer, + Py_ssize_t *buffer_len); + + /* + Takes an arbitrary object which must support the (writable, + single segment) buffer interface and returns a pointer to a + writable memory location in buffer of size buffer_len. + + 0 is returned on success. buffer and buffer_len are only + set in case no error occurs. Otherwise, -1 is returned and + an exception set. + */ + + /* new buffer API */ + +#ifndef Py_LIMITED_API +#define PyObject_CheckBuffer(obj) \ + (((obj)->ob_type->tp_as_buffer != NULL) && \ + ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + + /* Return 1 if the getbuffer function is available, otherwise + return 0 */ + + PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + + /* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. Returns -1 and raises an error on failure and returns 0 on + success + */ + + + PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); + + /* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices + */ + + PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); + + /* Return the implied itemsize of the data-format area from a + struct-style description */ + + + + /* Implementation in memoryobject.c */ + PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, + Py_ssize_t len, char order); + + PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, + Py_ssize_t len, char order); + + + /* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F', then if the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. + + */ + + PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + + /* Copy the data from the src buffer to the buffer of destination + */ + + PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort); + + + PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + + /* Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. + */ + + PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + + /* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. Returns 0 on success + and -1 (with raising an error) on error. + */ + + PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + + /* Releases a Py_buffer obtained from getbuffer ParseTuple's s*. + */ +#endif /* Py_LIMITED_API */ + + PyAPI_FUNC(PyObject *) PyObject_Format(PyObject* obj, + PyObject *format_spec); + /* + Takes an arbitrary object and returns the result of + calling obj.__format__(format_spec). + */ + +/* Iterators */ + + PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); + /* Takes an object and returns an iterator for it. + This is typically a new iterator but if the argument + is an iterator, this returns itself. */ + +#define PyIter_Check(obj) \ + ((obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + + PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); + /* Takes an iterator object and calls its tp_iternext slot, + returning the next value. If the iterator is exhausted, + this returns NULL without setting an exception. + NULL with an exception means an error occurred. */ + +/* Number Protocol:*/ + + PyAPI_FUNC(int) PyNumber_Check(PyObject *o); + + /* + Returns 1 if the object, o, provides numeric protocols, and + false otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o1 and o2, or null on failure. + This is the equivalent of the Python expression: o1+o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, or null on + failure. This is the equivalent of the Python expression: + o1-o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 and o2, or null on + failure. This is the equivalent of the Python expression: + o1*o2. + */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 + PyAPI_FUNC(PyObject *) PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2); + + /* + This is the equivalent of the Python expression: o1 @ o2. + */ +#endif + + PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + or null on failure. + This is the equivalent of the Python expression: o1//o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + or null on failure. + This is the equivalent of the Python expression: o1/o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, or null on + failure. This is the equivalent of the Python expression: + o1%o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); + + /* + See the built-in function divmod. Returns NULL on failure. + This is the equivalent of the Python expression: + divmod(o1,o2). + */ + + PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + See the built-in function pow. Returns NULL on failure. + This is the equivalent of the Python expression: + pow(o1,o2,o3), where o3 is optional. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); + + /* + Returns the negation of o on success, or null on failure. + This is the equivalent of the Python expression: -o. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); + + /* + Returns the (what?) of o on success, or NULL on failure. + This is the equivalent of the Python expression: +o. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); + + /* + Returns the absolute value of o, or null on failure. This is + the equivalent of the Python expression: abs(o). + */ + + PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); + + /* + Returns the bitwise negation of o on success, or NULL on + failure. This is the equivalent of the Python expression: + ~o. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 << o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1 >> o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1&o2. + + */ + + PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1^o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or on o1 and o2 on success, or + NULL on failure. This is the equivalent of the Python + expression: o1|o2. + */ + +#define PyIndex_Check(obj) \ + ((obj)->ob_type->tp_as_number != NULL && \ + (obj)->ob_type->tp_as_number->nb_index != NULL) + + PyAPI_FUNC(PyObject *) PyNumber_Index(PyObject *o); + + /* + Returns the object converted to a Python int + or NULL with an error raised on failure. + */ + + PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc); + + /* + Returns the object converted to Py_ssize_t by going through + PyNumber_Index first. If an overflow error occurs while + converting the int to Py_ssize_t, then the second argument + is the error-type to return. If it is NULL, then the overflow error + is cleared and the value is clipped. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); + + /* + Returns the o converted to an integer object on success, or + NULL on failure. This is the equivalent of the Python + expression: int(o). + */ + + PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); + + /* + Returns the o converted to a float object on success, or NULL + on failure. This is the equivalent of the Python expression: + float(o). + */ + +/* In-place variants of (some of) the above number protocol functions */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2); + + /* + Returns the result of adding o2 to o1, possibly in-place, or null + on failure. This is the equivalent of the Python expression: + o1 += o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); + + /* + Returns the result of subtracting o2 from o1, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 -= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); + + /* + Returns the result of multiplying o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 *= o2. + */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 + PyAPI_FUNC(PyObject *) PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2); + + /* + This is the equivalent of the Python expression: o1 @= o2. + */ +#endif + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); + + /* + Returns the remainder of dividing o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 %= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, + PyObject *o3); + + /* + Returns the result of raising o1 to the power of o2, possibly + in-place, or null on failure. This is the equivalent of the Python + expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of left shifting o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 <<= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); + + /* + Returns the result of right shifting o1 by o2, possibly in-place or + null on failure. This is the equivalent of the Python expression: + o1 >>= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise and of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 &= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); + + /* + Returns the bitwise exclusive or of o1 by o2, possibly in-place, or + null on failure. This is the equivalent of the Python expression: + o1 ^= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); + + /* + Returns the result of bitwise or of o1 and o2, possibly in-place, + or null on failure. This is the equivalent of the Python + expression: o1 |= o2. + */ + + PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base); + + /* + Returns the integer n converted to a string with a base, with a base + marker of 0b, 0o or 0x prefixed if applicable. + If n is not an int object, it is converted with PyNumber_Index first. + */ + + +/* Sequence protocol:*/ + + PyAPI_FUNC(int) PySequence_Check(PyObject *o); + + /* + Return 1 if the object provides sequence protocol, and zero + otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); + + /* + Return the size of sequence object o, or -1 on failure. + */ + + /* For DLL compatibility */ +#undef PySequence_Length + PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject *o); +#define PySequence_Length PySequence_Size + + + PyAPI_FUNC(PyObject *) PySequence_Concat(PyObject *o1, PyObject *o2); + + /* + Return the concatenation of o1 and o2 on success, and NULL on + failure. This is the equivalent of the Python + expression: o1+o2. + */ + + PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); + + /* + Return the result of repeating sequence object o count times, + or NULL on failure. This is the equivalent of the Python + expression: o1*count. + */ + + PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); + + /* + Return the ith element of o, or NULL on failure. This is the + equivalent of the Python expression: o[i]. + */ + + PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Return the slice of sequence object o between i1 and i2, or + NULL on failure. This is the equivalent of the Python + expression: o[i1:i2]. + */ + + PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); + + /* + Assign object v to the ith element of o. Raise an exception and return + -1 on failure; return 0 on success. This is the equivalent of the + Python statement o[i]=v. + */ + + PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); + + /* + Delete the ith element of object v. Returns + -1 on failure. This is the equivalent of the Python + statement: del o[i]. + */ + + PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, + PyObject *v); + + /* + Assign the sequence object, v, to the slice in sequence + object, o, from i1 to i2. Returns -1 on failure. This is the + equivalent of the Python statement: o[i1:i2]=v. + */ + + PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + + /* + Delete the slice in sequence object, o, from i1 to i2. + Returns -1 on failure. This is the equivalent of the Python + statement: del o[i1:i2]. + */ + + PyAPI_FUNC(PyObject *) PySequence_Tuple(PyObject *o); + + /* + Returns the sequence, o, as a tuple on success, and NULL on failure. + This is equivalent to the Python expression: tuple(o) + */ + + + PyAPI_FUNC(PyObject *) PySequence_List(PyObject *o); + /* + Returns the sequence, o, as a list on success, and NULL on failure. + This is equivalent to the Python expression: list(o) + */ + + PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); + /* + Return the sequence, o, as a list, unless it's already a + tuple or list. Use PySequence_Fast_GET_ITEM to access the + members of this list, and PySequence_Fast_GET_SIZE to get its length. + + Returns NULL on failure. If the object does not support iteration, + raises a TypeError exception with m as the message text. + */ + +#define PySequence_Fast_GET_SIZE(o) \ + (PyList_Check(o) ? PyList_GET_SIZE(o) : PyTuple_GET_SIZE(o)) + /* + Return the size of o, assuming that o was returned by + PySequence_Fast and is not NULL. + */ + +#define PySequence_Fast_GET_ITEM(o, i)\ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) + /* + Return the ith element of o, assuming that o was returned by + PySequence_Fast, and that i is within bounds. + */ + +#define PySequence_ITEM(o, i)\ + ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) ) + /* Assume tp_as_sequence and sq_item exist and that i does not + need to be corrected for a negative index + */ + +#define PySequence_Fast_ITEMS(sf) \ + (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ + : ((PyTupleObject *)(sf))->ob_item) + /* Return a pointer to the underlying item array for + an object retured by PySequence_Fast */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject *o, PyObject *value); + + /* + Return the number of occurrences on value on o, that is, + return the number of keys for which o[key]==value. On + failure, return -1. This is equivalent to the Python + expression: o.count(value). + */ + + PyAPI_FUNC(int) PySequence_Contains(PyObject *seq, PyObject *ob); + /* + Return -1 if error; 1 if ob in seq; 0 if ob not in seq. + Use __contains__ if possible, else _PySequence_IterSearch(). + */ + +#ifndef Py_LIMITED_API +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); +#endif + /* + Iterate over seq. Result depends on the operation: + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. + */ + +/* For DLL-level backwards compatibility */ +#undef PySequence_In + PyAPI_FUNC(int) PySequence_In(PyObject *o, PyObject *value); + +/* For source-level backwards compatibility */ +#define PySequence_In PySequence_Contains + + /* + Determine if o contains value. If an item in o is equal to + X, return 1, otherwise return 0. On error, return -1. This + is equivalent to the Python expression: value in o. + */ + + PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject *o, PyObject *value); + + /* + Return the first index for which o[i]=value. On error, + return -1. This is equivalent to the Python + expression: o.index(value). + */ + +/* In-place versions of some of the above Sequence functions. */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2); + + /* + Append o2 to o1, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 += o2. + + */ + + PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); + + /* + Repeat o1 by count, in-place when possible. Return the resulting + object, which could be o1, or NULL on failure. This is the + equivalent of the Python expression: o1 *= count. + + */ + +/* Mapping protocol:*/ + + PyAPI_FUNC(int) PyMapping_Check(PyObject *o); + + /* + Return 1 if the object provides mapping protocol, and zero + otherwise. + + This function always succeeds. + */ + + PyAPI_FUNC(Py_ssize_t) PyMapping_Size(PyObject *o); + + /* + Returns the number of keys in object o on success, and -1 on + failure. For objects that do not provide sequence protocol, + this is equivalent to the Python expression: len(o). + */ + + /* For DLL compatibility */ +#undef PyMapping_Length + PyAPI_FUNC(Py_ssize_t) PyMapping_Length(PyObject *o); +#define PyMapping_Length PyMapping_Size + + + /* implemented as a macro: + + int PyMapping_DelItemString(PyObject *o, const char *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItemString(O,K) PyObject_DelItemString((O),(K)) + + /* implemented as a macro: + + int PyMapping_DelItem(PyObject *o, PyObject *key); + + Remove the mapping for object, key, from the object *o. + Returns -1 on failure. This is equivalent to + the Python statement: del o[key]. + */ +#define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) + + PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); + + /* + On success, return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + key in o. + + This function always succeeds. + */ + + PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); + + /* + Return 1 if the mapping object has the key, key, + and 0 otherwise. This is equivalent to the Python expression: + key in o. + + This function always succeeds. + + */ + + PyAPI_FUNC(PyObject *) PyMapping_Keys(PyObject *o); + + /* + On success, return a list or tuple of the keys in object o. + On failure, return NULL. + */ + + PyAPI_FUNC(PyObject *) PyMapping_Values(PyObject *o); + + /* + On success, return a list or tuple of the values in object o. + On failure, return NULL. + */ + + PyAPI_FUNC(PyObject *) PyMapping_Items(PyObject *o); + + /* + On success, return a list or tuple of the items in object o, + where each item is a tuple containing a key-value pair. + On failure, return NULL. + + */ + + PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, + const char *key); + + /* + Return element of o corresponding to the object, key, or NULL + on failure. This is the equivalent of the Python expression: + o[key]. + */ + + PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, const char *key, + PyObject *value); + + /* + Map the object, key, to the value, v. Returns + -1 on failure. This is the equivalent of the Python + statement: o[key]=v. + */ + + +PyAPI_FUNC(int) PyObject_IsInstance(PyObject *object, PyObject *typeorclass); + /* isinstance(object, typeorclass) */ + +PyAPI_FUNC(int) PyObject_IsSubclass(PyObject *object, PyObject *typeorclass); + /* issubclass(object, typeorclass) */ + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + +PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self); + +PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]); + +/* For internal use by buffer API functions */ +PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +#endif /* !Py_LIMITED_API */ + + +#ifdef __cplusplus +} +#endif +#endif /* Py_ABSTRACTOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/accu.h b/flaskwebproject/FlaskWebProject1/Include/accu.h new file mode 100644 index 0000000..3636ea6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/accu.h @@ -0,0 +1,37 @@ +#ifndef Py_LIMITED_API +#ifndef Py_ACCU_H +#define Py_ACCU_H + +/*** This is a private API for use by the interpreter and the stdlib. + *** Its definition may be changed or removed at any moment. + ***/ + +/* + * A two-level accumulator of unicode objects that avoids both the overhead + * of keeping a huge number of small separate objects, and the quadratic + * behaviour of using a naive repeated concatenation scheme. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef small /* defined by some Windows headers */ + +typedef struct { + PyObject *large; /* A list of previously accumulated large strings */ + PyObject *small; /* Pending small strings */ +} _PyAccu; + +PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc); +PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode); +PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); +PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); +PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_ACCU_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/asdl.h b/flaskwebproject/FlaskWebProject1/Include/asdl.h new file mode 100644 index 0000000..35e9fa1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/asdl.h @@ -0,0 +1,46 @@ +#ifndef Py_ASDL_H +#define Py_ASDL_H + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * bytes; +typedef PyObject * object; +typedef PyObject * singleton; +typedef PyObject * constant; + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +/* XXX A sequence should be typed so that its use can be typechecked. */ + +typedef struct { + Py_ssize_t size; + void *elements[1]; +} asdl_seq; + +typedef struct { + Py_ssize_t size; + int elements[1]; +} asdl_int_seq; + +asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); + +#define asdl_seq_GET(S, I) (S)->elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) +#ifdef Py_DEBUG +#define asdl_seq_SET(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(_asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ + } while (0) +#else +#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#endif + +#endif /* !Py_ASDL_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/ast.h b/flaskwebproject/FlaskWebProject1/Include/ast.h new file mode 100644 index 0000000..6a8c816 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/ast.h @@ -0,0 +1,22 @@ +#ifndef Py_AST_H +#define Py_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyAST_Validate(mod_ty); +PyAPI_FUNC(mod_ty) PyAST_FromNode( + const node *n, + PyCompilerFlags *flags, + const char *filename, /* decoded from the filesystem encoding */ + PyArena *arena); +PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( + const node *n, + PyCompilerFlags *flags, + PyObject *filename, + PyArena *arena); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_AST_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/bitset.h b/flaskwebproject/FlaskWebProject1/Include/bitset.h new file mode 100644 index 0000000..faeb419 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/bitset.h @@ -0,0 +1,32 @@ + +#ifndef Py_BITSET_H +#define Py_BITSET_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bitset interface */ + +#define BYTE char + +typedef BYTE *bitset; + +bitset newbitset(int nbits); +void delbitset(bitset bs); +#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) +int addbit(bitset bs, int ibit); /* Returns 0 if already set */ +int samebitset(bitset bs1, bitset bs2, int nbits); +void mergebitset(bitset bs1, bitset bs2, int nbits); + +#define BITSPERBYTE (8*sizeof(BYTE)) +#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE) + +#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) +#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) +#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) +#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BITSET_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/bltinmodule.h b/flaskwebproject/FlaskWebProject1/Include/bltinmodule.h new file mode 100644 index 0000000..868c9e6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/bltinmodule.h @@ -0,0 +1,14 @@ +#ifndef Py_BLTINMODULE_H +#define Py_BLTINMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyFilter_Type; +PyAPI_DATA(PyTypeObject) PyMap_Type; +PyAPI_DATA(PyTypeObject) PyZip_Type; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BLTINMODULE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/boolobject.h b/flaskwebproject/FlaskWebProject1/Include/boolobject.h new file mode 100644 index 0000000..7cc2f1f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/boolobject.h @@ -0,0 +1,34 @@ +/* Boolean object interface */ + +#ifndef Py_BOOLOBJECT_H +#define Py_BOOLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_DATA(PyTypeObject) PyBool_Type; + +#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) + +/* Py_False and Py_True are the only two bools in existence. +Don't forget to apply Py_INCREF() when returning either!!! */ + +/* Don't use these directly */ +PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; + +/* Use these macros */ +#define Py_False ((PyObject *) &_Py_FalseStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +/* Macros for returning Py_True or Py_False, respectively */ +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False + +/* Function to return a bool from a C long */ +PyAPI_FUNC(PyObject *) PyBool_FromLong(long); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BOOLOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/bytearrayobject.h b/flaskwebproject/FlaskWebProject1/Include/bytearrayobject.h new file mode 100644 index 0000000..a757b88 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/bytearrayobject.h @@ -0,0 +1,62 @@ +/* ByteArray object interface */ + +#ifndef Py_BYTEARRAYOBJECT_H +#define Py_BYTEARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Type PyByteArrayObject represents a mutable array of bytes. + * The Python API is that of a sequence; + * the bytes are mapped to ints in [0, 256). + * Bytes are not characters; they may be used to encode characters. + * The only way to go between bytes and str/unicode is via encoding + * and decoding. + * For the convenience of C programmers, the bytes type is considered + * to contain a char pointer, not an unsigned char pointer. + */ + +/* Object layout */ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ + int ob_exports; /* How many buffer exports */ +} PyByteArrayObject; +#endif + +/* Type object */ +PyAPI_DATA(PyTypeObject) PyByteArray_Type; +PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; + +/* Type check macros */ +#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) +#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) + +/* Direct API functions */ +PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); +PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); +PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); + +/* Macros, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/bytes_methods.h b/flaskwebproject/FlaskWebProject1/Include/bytes_methods.h new file mode 100644 index 0000000..7fa7540 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/bytes_methods.h @@ -0,0 +1,67 @@ +#ifndef Py_LIMITED_API +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +/* + * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); + +extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); +extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); +extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); + +/* The maketrans() static method. */ +extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; +extern const char _Py_count__doc__[]; +extern const char _Py_find__doc__[]; +extern const char _Py_index__doc__[]; +extern const char _Py_rfind__doc__[]; +extern const char _Py_rindex__doc__[]; +extern const char _Py_startswith__doc__[]; +extern const char _Py_endswith__doc__[]; +extern const char _Py_maketrans__doc__[]; +extern const char _Py_expandtabs__doc__[]; +extern const char _Py_ljust__doc__[]; +extern const char _Py_rjust__doc__[]; +extern const char _Py_center__doc__[]; +extern const char _Py_zfill__doc__[]; + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/bytesobject.h b/flaskwebproject/FlaskWebProject1/Include/bytesobject.h new file mode 100644 index 0000000..0f0bf9f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/bytesobject.h @@ -0,0 +1,224 @@ + +/* Bytes (String) object interface */ + +#ifndef Py_BYTESOBJECT_H +#define Py_BYTESOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* +Type PyBytesObject represents a character string. An extra zero byte is +reserved at the end to ensure it is zero-terminated, but a size is +present so strings with null bytes in them can be represented. This +is an immutable object type. + +There are functions to create new string objects, to test +an object for string-ness, and to get the +string value. The latter function returns a null pointer +if the object is not of the proper type. +There is a variant that takes an explicit size as well as a +variant that assumes a zero-terminated string. Note that none of the +functions should be applied to nil objects. +*/ + +/* Caching the hash (ob_shash) saves recalculation of a string's hash value. + This significantly speeds up dict lookups. */ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + */ +} PyBytesObject; +#endif + +PyAPI_DATA(PyTypeObject) PyBytes_Type; +PyAPI_DATA(PyTypeObject) PyBytesIter_Type; + +#define PyBytes_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) +#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) + +PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); +PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list) + Py_GCC_ATTRIBUTE((format(printf, 1, 0))); +PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *); +PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); +PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); +PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); +#endif +PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *); +#ifndef Py_LIMITED_API +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *, + const char **); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) +#endif + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); +#endif + +/* Provides access to the internal data buffer and size of a string + object or the default encoded version of a Unicode object. Passing + NULL as *len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NULL characters will + cause an exception). */ +PyAPI_FUNC(int) PyBytes_AsStringAndSize( + PyObject *obj, /* string or Unicode object */ + char **s, /* pointer to buffer variable */ + Py_ssize_t *len /* pointer to length variable or NULL + (only possible for 0-terminated + strings) */ + ); + +/* Using the current locale, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width); + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + const char *thousands_sep); +#endif + +/* Flags used by string formatting */ +#define F_LJUST (1<<0) +#define F_SIGN (1<<1) +#define F_BLANK (1<<2) +#define F_ALT (1<<3) +#define F_ZERO (1<<4) + +#ifndef Py_LIMITED_API +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTESOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/cellobject.h b/flaskwebproject/FlaskWebProject1/Include/cellobject.h new file mode 100644 index 0000000..a0aa4d9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/cellobject.h @@ -0,0 +1,29 @@ +/* Cell object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_CELLOBJECT_H +#define Py_CELLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *ob_ref; /* Content of the cell or NULL when empty */ +} PyCellObject; + +PyAPI_DATA(PyTypeObject) PyCell_Type; + +#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) + +PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); +PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); +PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); + +#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) +#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/ceval.h b/flaskwebproject/FlaskWebProject1/Include/ceval.h new file mode 100644 index 0000000..38d4709 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/ceval.h @@ -0,0 +1,236 @@ +#ifndef Py_CEVAL_H +#define Py_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to random parts in ceval.c */ + +PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( + PyObject *func, PyObject *args, PyObject *kwargs); + +/* Inline this */ +#define PyEval_CallObject(func,arg) \ + PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) + +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj, + const char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, + const char *methodname, + const char *format, ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) _PyEval_SetCoroutineWrapper(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetCoroutineWrapper(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); +#endif + +struct _frame; /* Avoid including frameobject.h */ + +PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); + +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); +#endif + +PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); +PyAPI_FUNC(void) _PyEval_SignalReceived(void); +PyAPI_FUNC(int) Py_MakePendingCalls(void); + +/* Protection against deeply nested recursive calls + + In Python 3.0, this protection has two levels: + * normal anti-recursion protection is triggered when the recursion level + exceeds the current recursion limit. It raises a RecursionError, and sets + the "overflowed" flag in the thread state structure. This flag + temporarily *disables* the normal protection; this allows cleanup code + to potentially outgrow the recursion limit while processing the + RecursionError. + * "last chance" anti-recursion protection is triggered when the recursion + level exceeds "current recursion limit + 50". By construction, this + protection can only be triggered when the "overflowed" flag is set. It + means the cleanup code has itself gone into an infinite loop, or the + RecursionError has been mistakingly ignored. When this protection is + triggered, the interpreter aborts with a Fatal Error. + + In addition, the "overflowed" flag is automatically reset when the + recursion level drops below "current recursion limit - 50". This heuristic + is meant to ensure that the normal anti-recursion protection doesn't get + disabled too long. + + Please note: this scheme has its own limitations. See: + http://mail.python.org/pipermail/python-dev/2008-August/082106.html + for some observations. +*/ +PyAPI_FUNC(void) Py_SetRecursionLimit(int); +PyAPI_FUNC(int) Py_GetRecursionLimit(void); + +#define Py_EnterRecursiveCall(where) \ + (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ + _Py_CheckRecursiveCall(where)) +#define Py_LeaveRecursiveCall() \ + do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ + PyThreadState_GET()->overflowed = 0; \ + } while(0) +PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where); +PyAPI_DATA(int) _Py_CheckRecursionLimit; + +#ifdef USE_STACKCHECK +/* With USE_STACKCHECK, we artificially decrement the recursion limit in order + to trigger regular stack checks in _Py_CheckRecursiveCall(), except if + the "overflowed" flag is set, in which case we need the true value + of _Py_CheckRecursionLimit for _Py_MakeEndRecCheck() to function properly. +*/ +# define _Py_MakeRecCheck(x) \ + (++(x) > (_Py_CheckRecursionLimit += PyThreadState_GET()->overflowed - 1)) +#else +# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) +#endif + +/* Compute the "lower-water mark" for a recursion limit. When + * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, + * the overflowed flag is reset to 0. */ +#define _Py_RecursionLimitLowerWaterMark(limit) \ + (((limit) > 200) \ + ? ((limit) - 50) \ + : (3 * ((limit) >> 2))) + +#define _Py_MakeEndRecCheck(x) \ + (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit)) + +#define Py_ALLOW_RECURSION \ + do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ + PyThreadState_GET()->recursion_critical = 1; + +#define Py_END_ALLOW_RECURSION \ + PyThreadState_GET()->recursion_critical = _old; \ + } while(0); + +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); +#endif + +/* Interface for threads. + + A module that plans to do a blocking system call (or something else + that lasts a long time and doesn't touch Python data) can allow other + threads to run as follows: + + ...preparations here... + Py_BEGIN_ALLOW_THREADS + ...blocking system call here... + Py_END_ALLOW_THREADS + ...interpret result here... + + The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a + {}-surrounded block. + To leave the block in the middle (e.g., with return), you must insert + a line containing Py_BLOCK_THREADS before the return, e.g. + + if (...premature_exit...) { + Py_BLOCK_THREADS + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + + An alternative is: + + Py_BLOCK_THREADS + if (...premature_exit...) { + PyErr_SetFromErrno(PyExc_IOError); + return NULL; + } + Py_UNBLOCK_THREADS + + For convenience, that the value of 'errno' is restored across + Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. + + WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND + Py_END_ALLOW_THREADS!!! + + The function PyEval_InitThreads() should be called only from + init_thread() in "_threadmodule.c". + + Note that not yet all candidates have been converted to use this + mechanism! +*/ + +PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); +PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); + +#ifdef WITH_THREAD + +PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +PyAPI_FUNC(void) PyEval_InitThreads(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_FiniThreads(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyEval_AcquireLock(void); +PyAPI_FUNC(void) PyEval_ReleaseLock(void); +PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReInitThreads(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); +PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); +#endif + +#define Py_BEGIN_ALLOW_THREADS { \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); +#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); +#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); +#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ + } + +#else /* !WITH_THREAD */ + +#define Py_BEGIN_ALLOW_THREADS { +#define Py_BLOCK_THREADS +#define Py_UNBLOCK_THREADS +#define Py_END_ALLOW_THREADS } + +#endif /* !WITH_THREAD */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); +#endif + +/* Masks and values used by FORMAT_VALUE opcode. */ +#define FVC_MASK 0x3 +#define FVC_NONE 0x0 +#define FVC_STR 0x1 +#define FVC_REPR 0x2 +#define FVC_ASCII 0x3 +#define FVS_MASK 0x4 +#define FVS_HAVE_SPEC 0x4 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CEVAL_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/classobject.h b/flaskwebproject/FlaskWebProject1/Include/classobject.h new file mode 100644 index 0000000..eeeb3e9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/classobject.h @@ -0,0 +1,58 @@ +/* Former class object interface -- now only bound methods are here */ + +/* Revealing some structures (not for general use) */ + +#ifndef Py_LIMITED_API +#ifndef Py_CLASSOBJECT_H +#define Py_CLASSOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *im_func; /* The callable object implementing the method */ + PyObject *im_self; /* The instance it is bound to */ + PyObject *im_weakreflist; /* List of weak references */ +} PyMethodObject; + +PyAPI_DATA(PyTypeObject) PyMethod_Type; + +#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) + +PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyMethod_GET_FUNCTION(meth) \ + (((PyMethodObject *)meth) -> im_func) +#define PyMethod_GET_SELF(meth) \ + (((PyMethodObject *)meth) -> im_self) + +PyAPI_FUNC(int) PyMethod_ClearFreeList(void); + +typedef struct { + PyObject_HEAD + PyObject *func; +} PyInstanceMethodObject; + +PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; + +#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) + +PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyInstanceMethod_GET_FUNCTION(meth) \ + (((PyInstanceMethodObject *)meth) -> func) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CLASSOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/code.h b/flaskwebproject/FlaskWebProject1/Include/code.h new file mode 100644 index 0000000..c5fce3c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/code.h @@ -0,0 +1,157 @@ +/* Definitions for bytecode */ + +#ifndef Py_LIMITED_API +#ifndef Py_CODE_H +#define Py_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint16_t _Py_CODEUNIT; + +#ifdef WORDS_BIGENDIAN +# define _Py_OPCODE(word) ((word) >> 8) +# define _Py_OPARG(word) ((word) & 255) +#else +# define _Py_OPCODE(word) ((word) & 255) +# define _Py_OPARG(word) ((word) >> 8) +#endif + +/* Bytecode object */ +typedef struct { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_kwonlyargcount; /* #keyword only arguments */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + int co_firstlineno; /* first source line number */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest aren't used in either hash or comparisons, except for co_name, + used in both. This is done to preserve the name and line number + for tracebacks and debuggers; otherwise, constant de-duplication + would collapse identical functions/lambdas defined on different lines. + */ + unsigned char *co_cell2arg; /* Maps cell vars which are arguments. */ + PyObject *co_filename; /* unicode (where it was loaded from) */ + PyObject *co_name; /* unicode (name, for reference) */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ + /* Scratch space for extra data relating to the code object. + Type is a void* to keep the format private in codeobject.c to force + people to go through the proper APIs. */ + void *co_extra; +} PyCodeObject; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +/* The CO_COROUTINE flag is set for coroutine functions (defined with + ``async def`` keywords) */ +#define CO_COROUTINE 0x0080 +#define CO_ITERABLE_COROUTINE 0x0100 +#define CO_ASYNC_GENERATOR 0x0200 + +/* These are no longer used. */ +#if 0 +#define CO_GENERATOR_ALLOWED 0x1000 +#endif +#define CO_FUTURE_DIVISION 0x2000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x8000 +#define CO_FUTURE_PRINT_FUNCTION 0x10000 +#define CO_FUTURE_UNICODE_LITERALS 0x20000 + +#define CO_FUTURE_BARRY_AS_BDFL 0x40000 +#define CO_FUTURE_GENERATOR_STOP 0x80000 + +/* This value is found in the co_cell2arg array when the associated cell + variable does not correspond to an argument. The maximum number of + arguments is 255 (indexed up to 254), so 255 work as a special flag.*/ +#define CO_CELL_NOT_AN_ARG 255 + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +#ifndef Py_LIMITED_API +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +/* Create a comparable key used to compare constants taking in account the + * object type. It is used to make sure types are not coerced (e.g., float and + * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms + * + * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) + * depending on the type and the value. The type is the first item to not + * compare bytes and str which can raise a BytesWarning exception. */ +PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); +#endif + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lnotab); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, + void **extra); +PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, + void *extra); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODE_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/codecs.h b/flaskwebproject/FlaskWebProject1/Include/codecs.h new file mode 100644 index 0000000..3ad0f2b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/codecs.h @@ -0,0 +1,240 @@ +#ifndef Py_CODECREGISTRY_H +#define Py_CODECREGISTRY_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------ + + Python Codec Registry and support functions + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. + + ------------------------------------------------------------------------ */ + +/* Register a new codec search function. + + As side effect, this tries to load the encodings package, if not + yet done, to make sure that it is always first in the list of + search functions. + + The search_function's refcount is incremented by this function. */ + +PyAPI_FUNC(int) PyCodec_Register( + PyObject *search_function + ); + +/* Codec registry lookup API. + + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. + + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. + + If no codec is found, a KeyError is set and NULL returned. + + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. + + */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCodec_Lookup( + const char *encoding + ); + +PyAPI_FUNC(int) _PyCodec_Forget( + const char *encoding + ); +#endif + +/* Codec registry encoding check API. + + Returns 1/0 depending on whether there is a registered codec for + the given encoding. + +*/ + +PyAPI_FUNC(int) PyCodec_KnownEncoding( + const char *encoding + ); + +/* Generic codec based encoding API. + + object is passed through the encoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Encode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* Generic codec based decoding API. + + object is passed through the decoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Decode( + PyObject *object, + const char *encoding, + const char *errors + ); + +#ifndef Py_LIMITED_API +/* Text codec specific encoding and decoding API. + + Checks the encoding against a list of codecs which do not + implement a str<->bytes encoding before attempting the + operation. + + Please note that these APIs are internal and should not + be used in Python C extensions. + + XXX (ncoghlan): should we make these, or something like them, public + in Python 3.5+? + + */ +PyAPI_FUNC(PyObject *) _PyCodec_LookupTextEncoding( + const char *encoding, + const char *alternate_command + ); + +PyAPI_FUNC(PyObject *) _PyCodec_EncodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodec_DecodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* These two aren't actually text encoding specific, but _io.TextIOWrapper + * is the only current API consumer. + */ +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalDecoder( + PyObject *codec_info, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalEncoder( + PyObject *codec_info, + const char *errors + ); +#endif + + + +/* --- Codec Lookup APIs -------------------------------------------------- + + All APIs return a codec object with incremented refcount and are + based on _PyCodec_Lookup(). The same comments w/r to the encoding + name also apply to these APIs. + +*/ + +/* Get an encoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Encoder( + const char *encoding + ); + +/* Get a decoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Decoder( + const char *encoding + ); + +/* Get an IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get an IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + +/* Get a StreamReader factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamReader( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Get a StreamWriter factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Unicode encoding error handling callback registry API */ + +/* Register the error handling callback function error under the given + name. This function will be called by the codec when it encounters + unencodable characters/undecodable bytes and doesn't know the + callback name, when name is specified as the error parameter + in the call to the encode/decode function. + Return 0 on success, -1 on error */ +PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); + +/* Lookup the error handling callback function registered under the given + name. As a special case NULL can be passed, in which case + the error handling callback for "strict" will be returned. */ +PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); + +/* raise exc as an exception */ +PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); + +/* ignore the unicode error, skipping the faulty input */ +PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); + +/* replace the unicode encode error with ? or U+FFFD */ +PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with XML character references */ +PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* replace the unicode encode error with backslash escapes (\N, \x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc); +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(const char *) Py_hexdigits; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODECREGISTRY_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/compile.h b/flaskwebproject/FlaskWebProject1/Include/compile.h new file mode 100644 index 0000000..ecd8dc1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/compile.h @@ -0,0 +1,73 @@ +#ifndef Py_COMPILE_H +#define Py_COMPILE_H + +#ifndef Py_LIMITED_API +#include "code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +struct _node; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" +#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" +#define FUTURE_GENERATOR_STOP "generator_stop" + +struct _mod; /* Declare the existence of this type */ +#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) +PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +#define PY_INVALID_STACK_EFFECT INT_MAX +PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_LIMITED_API */ + +/* These definitions must match corresponding definitions in graminit.h. + There's code in compile.c that checks that they are the same. */ +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 + +#endif /* !Py_COMPILE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/complexobject.h b/flaskwebproject/FlaskWebProject1/Include/complexobject.h new file mode 100644 index 0000000..cb8c52c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/complexobject.h @@ -0,0 +1,69 @@ +/* Complex number structure */ + +#ifndef Py_COMPLEXOBJECT_H +#define Py_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + double real; + double imag; +} Py_complex; + +/* Operations on complex numbers from complexmodule.c */ + +PyAPI_FUNC(Py_complex) _Py_c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_neg(Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) _Py_c_abs(Py_complex); +#endif + +/* Complex object interface */ + +/* +PyComplexObject represents a complex number with double-precision +real and imaginary parts. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + Py_complex cval; +} PyComplexObject; +#endif + +PyAPI_DATA(PyTypeObject) PyComplex_Type; + +#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) +#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); +#endif +PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag); + +PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op); +PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); +#endif + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyComplex_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPLEXOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/datetime.h b/flaskwebproject/FlaskWebProject1/Include/datetime.h new file mode 100644 index 0000000..3bf35cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/datetime.h @@ -0,0 +1,260 @@ +/* datetime.h + */ +#ifndef Py_LIMITED_API +#ifndef DATETIME_H +#define DATETIME_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Fields are packed into successive bytes, each viewed as unsigned and + * big-endian, unless otherwise noted: + * + * byte offset + * 0 year 2 bytes, 1-9999 + * 2 month 1 byte, 1-12 + * 3 day 1 byte, 1-31 + * 4 hour 1 byte, 0-23 + * 5 minute 1 byte, 0-59 + * 6 second 1 byte, 0-59 + * 7 usecond 3 bytes, 0-999999 + * 10 + */ + +/* # of bytes for year, month, and day. */ +#define _PyDateTime_DATE_DATASIZE 4 + +/* # of bytes for hour, minute, second, and usecond. */ +#define _PyDateTime_TIME_DATASIZE 6 + +/* # of bytes for year, month, day, hour, minute, second, and usecond. */ +#define _PyDateTime_DATETIME_DATASIZE 10 + + +typedef struct +{ + PyObject_HEAD + Py_hash_t hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; + +typedef struct +{ + PyObject_HEAD /* a pure abstract base class */ +} PyDateTime_TZInfo; + + +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + Py_hash_t hashcode; \ + char hastzinfo; /* boolean flag */ + +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ +#define _PyDateTime_TIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_TIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_TIMEHEAD +} _PyDateTime_BaseTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_TIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_Time; /* hastzinfo true */ + + +/* All datetime objects are of PyDateTime_DateTimeType, but that can be + * allocated in two ways too, just like for time objects above. In addition, + * the plain date type is a base class for datetime, so it must also have + * a hastzinfo member (although it's unused there). + */ +typedef struct +{ + _PyTZINFO_HEAD + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; + +#define _PyDateTime_DATETIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_DATETIMEHEAD +} _PyDateTime_BaseDateTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_DATETIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_DateTime; /* hastzinfo true */ + + +/* Apply for date and datetime instances. */ +#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ + ((PyDateTime_Date*)o)->data[1]) +#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) +#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) + +#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) +#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) +#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) +#define PyDateTime_DATE_GET_MICROSECOND(o) \ + ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ + (((PyDateTime_DateTime*)o)->data[8] << 8) | \ + ((PyDateTime_DateTime*)o)->data[9]) +#define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) + +/* Apply for time instances. */ +#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) +#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) +#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) +#define PyDateTime_TIME_GET_MICROSECOND(o) \ + ((((PyDateTime_Time*)o)->data[3] << 16) | \ + (((PyDateTime_Time*)o)->data[4] << 8) | \ + ((PyDateTime_Time*)o)->data[5]) +#define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) + +/* Apply for time delta instances */ +#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) +#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds) +#define PyDateTime_DELTA_GET_MICROSECONDS(o) \ + (((PyDateTime_Delta*)o)->microseconds) + + +/* Define structure for C API. */ +typedef struct { + /* type objects */ + PyTypeObject *DateType; + PyTypeObject *DateTimeType; + PyTypeObject *TimeType; + PyTypeObject *DeltaType; + PyTypeObject *TZInfoType; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); + + /* PEP 495 constructors */ + PyObject *(*DateTime_FromDateAndTimeAndFold)(int, int, int, int, int, int, int, + PyObject*, int, PyTypeObject*); + PyObject *(*Time_FromTimeAndFold)(int, int, int, int, PyObject*, int, PyTypeObject*); + +} PyDateTime_CAPI; + +#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" + + +#ifdef Py_BUILD_CORE + +/* Macros for type checking when building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + +#else + +/* Define global variable for the C API and a macro for setting it. */ +static PyDateTime_CAPI *PyDateTimeAPI = NULL; + +#define PyDateTime_IMPORT \ + PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) + +/* Macros for type checking when not building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) + +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyDateTime_FromDateAndTimeAndFold(year, month, day, hour, min, sec, usec, fold) \ + PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, \ + min, sec, usec, Py_None, fold, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyTime_FromTimeAndFold(hour, minute, second, usecond, fold) \ + PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, usecond, \ + Py_None, fold, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + +/* Macros supporting the DB API. */ +#define PyDateTime_FromTimestamp(args) \ + PyDateTimeAPI->DateTime_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) + +#define PyDate_FromTimestamp(args) \ + PyDateTimeAPI->Date_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateType), args) + +#endif /* Py_BUILD_CORE */ + +#ifdef __cplusplus +} +#endif +#endif +#endif /* !Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/descrobject.h b/flaskwebproject/FlaskWebProject1/Include/descrobject.h new file mode 100644 index 0000000..8f3e84c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/descrobject.h @@ -0,0 +1,107 @@ +/* Descriptors */ +#ifndef Py_DESCROBJECT_H +#define Py_DESCROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef PyObject *(*getter)(PyObject *, void *); +typedef int (*setter)(PyObject *, PyObject *, void *); + +typedef struct PyGetSetDef { + char *name; + getter get; + setter set; + char *doc; + void *closure; +} PyGetSetDef; + +#ifndef Py_LIMITED_API +typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args, + void *wrapped); + +typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args, + void *wrapped, PyObject *kwds); + +struct wrapperbase { + char *name; + int offset; + void *function; + wrapperfunc wrapper; + char *doc; + int flags; + PyObject *name_strobj; +}; + +/* Flags for above struct */ +#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */ + +/* Various kinds of descriptor objects */ + +typedef struct { + PyObject_HEAD + PyTypeObject *d_type; + PyObject *d_name; + PyObject *d_qualname; +} PyDescrObject; + +#define PyDescr_COMMON PyDescrObject d_common + +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) + +typedef struct { + PyDescr_COMMON; + PyMethodDef *d_method; +} PyMethodDescrObject; + +typedef struct { + PyDescr_COMMON; + struct PyMemberDef *d_member; +} PyMemberDescrObject; + +typedef struct { + PyDescr_COMMON; + PyGetSetDef *d_getset; +} PyGetSetDescrObject; + +typedef struct { + PyDescr_COMMON; + struct wrapperbase *d_base; + void *d_wrapped; /* This can be any function pointer */ +} PyWrapperDescrObject; +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; +PyAPI_DATA(PyTypeObject) PyMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type; +#endif /* Py_LIMITED_API */ + +PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); +struct PyMemberDef; /* forward declaration for following prototype */ +PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *, + struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, + struct PyGetSetDef *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, + struct wrapperbase *, void *); +#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +#endif + +PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); +PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); + + +PyAPI_DATA(PyTypeObject) PyProperty_Type; +#ifdef __cplusplus +} +#endif +#endif /* !Py_DESCROBJECT_H */ + diff --git a/flaskwebproject/FlaskWebProject1/Include/dictobject.h b/flaskwebproject/FlaskWebProject1/Include/dictobject.h new file mode 100644 index 0000000..c4f2e2f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/dictobject.h @@ -0,0 +1,177 @@ +#ifndef Py_DICTOBJECT_H +#define Py_DICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Dictionary object type -- mapping from hashable object to object */ + +/* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. +*/ + +#ifndef Py_LIMITED_API + +typedef struct _dictkeysobject PyDictKeysObject; + +/* The ma_values pointer is NULL for a combined table + * or points to an array of PyObject* for a split table + */ +typedef struct { + PyObject_HEAD + + /* Number of items in the dictionary */ + Py_ssize_t ma_used; + + /* Dictionary version: globally unique, value change each time + the dictionary is modified */ + uint64_t ma_version_tag; + + PyDictKeysObject *ma_keys; + + /* If ma_values is NULL, the table is "combined": keys and values + are stored in ma_keys. + + If ma_values is not NULL, the table is splitted: + keys are stored in ma_keys and values are stored in ma_values */ + PyObject **ma_values; +} PyDictObject; + +typedef struct { + PyObject_HEAD + PyDictObject *dv_dict; +} _PyDictViewObject; + +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; + +#define PyDict_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDictKeys_Check(op) PyObject_TypeCheck(op, &PyDictKeys_Type) +#define PyDictItems_Check(op) PyObject_TypeCheck(op, &PyDictItems_Type) +#define PyDictValues_Check(op) PyObject_TypeCheck(op, &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + + +PyAPI_FUNC(PyObject *) PyDict_New(void); +PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +#endif +PyAPI_FUNC(PyObject *) PyDict_GetItemWithError(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp, + struct _Py_Identifier *key); +PyAPI_FUNC(PyObject *) PyDict_SetDefault( + PyObject *mp, PyObject *key, PyObject *defaultobj); +#endif +PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, + PyObject *item, Py_hash_t hash); +#endif +PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, + int (*predicate)(PyObject *value)); +#endif +PyAPI_FUNC(void) PyDict_Clear(PyObject *mp); +PyAPI_FUNC(int) PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value); +#ifndef Py_LIMITED_API +PyDictKeysObject *_PyDict_NewKeysForClass(void); +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +PyAPI_FUNC(int) _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); +PyObject *_PyDictView_New(PyObject *, PyTypeObject *); +#endif +PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); +PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash); +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); +PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); +Py_ssize_t _PyDict_KeysSize(PyDictKeysObject *keys); +Py_ssize_t _PyDict_SizeOf(PyDictObject *); +PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *); +PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); +PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); +#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) + +PyAPI_FUNC(int) PyDict_ClearFreeList(void); +#endif + +/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ +PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); + +/* PyDict_Merge updates/merges from a mapping object (an object that + supports PyMapping_Keys() and PyObject_GetItem()). If override is true, + the last occurrence of a key wins, else the first. The Python + dict.update(other) is equivalent to PyDict_Merge(dict, other, 1). +*/ +PyAPI_FUNC(int) PyDict_Merge(PyObject *mp, + PyObject *other, + int override); + +#ifndef Py_LIMITED_API +/* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, + the first occurrence of a key wins, if override is 1, the last occurrence + of a key wins, if override is 2, a KeyError with conflicting key as + argument is raised. +*/ +PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); +PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other); +#endif + +/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing + iterable objects of length 2. If override is true, the last occurrence + of a key wins, else the first. The Python dict constructor dict(seq2) + is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1). +*/ +PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, + PyObject *seq2, + int override); + +PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); +PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); + +int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); +PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DICTOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/dtoa.h b/flaskwebproject/FlaskWebProject1/Include/dtoa.h new file mode 100644 index 0000000..9bfb625 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/dtoa.h @@ -0,0 +1,19 @@ +#ifndef Py_LIMITED_API +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); +PyAPI_FUNC(double) _Py_dg_stdnan(int sign); +PyAPI_FUNC(double) _Py_dg_infinity(int sign); + + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/flaskwebproject/FlaskWebProject1/Include/dynamic_annotations.h b/flaskwebproject/FlaskWebProject1/Include/dynamic_annotations.h new file mode 100644 index 0000000..0bd1a83 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/dynamic_annotations.h @@ -0,0 +1,499 @@ +/* Copyright (c) 2008-2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Kostya Serebryany + * Copied to CPython by Jeffrey Yasskin, with all macros renamed to + * start with _Py_ to avoid colliding with users embedding Python, and + * with deprecated macros removed. + */ + +/* This file defines dynamic annotations for use with dynamic analysis + tool such as valgrind, PIN, etc. + + Dynamic annotation is a source code annotation that affects + the generated code (that is, the annotation is not a comment). + Each such annotation is attached to a particular + instruction and/or to a particular object (address) in the program. + + The annotations that should be used by users are macros in all upper-case + (e.g., _Py_ANNOTATE_NEW_MEMORY). + + Actual implementation of these macros may differ depending on the + dynamic analysis tool being used. + + See http://code.google.com/p/data-race-test/ for more information. + + This file supports the following dynamic analysis tools: + - None (DYNAMIC_ANNOTATIONS_ENABLED is not defined or zero). + Macros are defined empty. + - ThreadSanitizer, Helgrind, DRD (DYNAMIC_ANNOTATIONS_ENABLED is 1). + Macros are defined as calls to non-inlinable empty functions + that are intercepted by Valgrind. */ + +#ifndef __DYNAMIC_ANNOTATIONS_H__ +#define __DYNAMIC_ANNOTATIONS_H__ + +#ifndef DYNAMIC_ANNOTATIONS_ENABLED +# define DYNAMIC_ANNOTATIONS_ENABLED 0 +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 + + /* ------------------------------------------------------------- + Annotations useful when implementing condition variables such as CondVar, + using conditional critical sections (Await/LockWhen) and when constructing + user-defined synchronization mechanisms. + + The annotations _Py_ANNOTATE_HAPPENS_BEFORE() and + _Py_ANNOTATE_HAPPENS_AFTER() can be used to define happens-before arcs in + user-defined synchronization mechanisms: the race detector will infer an + arc from the former to the latter when they share the same argument + pointer. + + Example 1 (reference counting): + + void Unref() { + _Py_ANNOTATE_HAPPENS_BEFORE(&refcount_); + if (AtomicDecrementByOne(&refcount_) == 0) { + _Py_ANNOTATE_HAPPENS_AFTER(&refcount_); + delete this; + } + } + + Example 2 (message queue): + + void MyQueue::Put(Type *e) { + MutexLock lock(&mu_); + _Py_ANNOTATE_HAPPENS_BEFORE(e); + PutElementIntoMyQueue(e); + } + + Type *MyQueue::Get() { + MutexLock lock(&mu_); + Type *e = GetElementFromMyQueue(); + _Py_ANNOTATE_HAPPENS_AFTER(e); + return e; + } + + Note: when possible, please use the existing reference counting and message + queue implementations instead of inventing new ones. */ + + /* Report that wait on the condition variable at address "cv" has succeeded + and the lock at address "lock" is held. */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, lock) + + /* Report that wait on the condition variable at "cv" has succeeded. Variant + w/o lock. */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, NULL) + + /* Report that we are about to signal on the condition variable at address + "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) \ + AnnotateCondVarSignal(__FILE__, __LINE__, cv) + + /* Report that we are about to signal_all on the condition variable at "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) \ + AnnotateCondVarSignalAll(__FILE__, __LINE__, cv) + + /* Annotations for user-defined synchronization mechanisms. */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) _Py_ANNOTATE_CONDVAR_SIGNAL(obj) +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) _Py_ANNOTATE_CONDVAR_WAIT(obj) + + /* Report that the bytes in the range [pointer, pointer+size) are about + to be published safely. The race checker will create a happens-before + arc from the call _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) to + subsequent accesses to this memory. + Note: this annotation may not work properly if the race detector uses + sampling, i.e. does not observe all memory accesses. + */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) \ + AnnotatePublishMemoryRange(__FILE__, __LINE__, pointer, size) + + /* Instruct the tool to create a happens-before arc between mu->Unlock() and + mu->Lock(). This annotation may slow down the race detector and hide real + races. Normally it is used only when it would be difficult to annotate each + of the mutex's critical sections individually using the annotations above. + This annotation makes sense only for hybrid race detectors. For pure + happens-before detectors this is a no-op. For more details see + http://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \ + AnnotateMutexIsUsedAsCondVar(__FILE__, __LINE__, mu) + + /* ------------------------------------------------------------- + Annotations useful when defining memory allocators, or when memory that + was protected in one way starts to be protected in another. */ + + /* Report that a new memory at "address" of size "size" has been allocated. + This might be used when the memory has been retrieved from a free list and + is about to be reused, or when the locking discipline for a variable + changes. */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) \ + AnnotateNewMemory(__FILE__, __LINE__, address, size) + + /* ------------------------------------------------------------- + Annotations useful when defining FIFO queues that transfer data between + threads. */ + + /* Report that the producer-consumer queue (such as ProducerConsumerQueue) at + address "pcq" has been created. The _Py_ANNOTATE_PCQ_* annotations should + be used only for FIFO queues. For non-FIFO queues use + _Py_ANNOTATE_HAPPENS_BEFORE (for put) and _Py_ANNOTATE_HAPPENS_AFTER (for + get). */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) \ + AnnotatePCQCreate(__FILE__, __LINE__, pcq) + + /* Report that the queue at address "pcq" is about to be destroyed. */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) \ + AnnotatePCQDestroy(__FILE__, __LINE__, pcq) + + /* Report that we are about to put an element into a FIFO queue at address + "pcq". */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) \ + AnnotatePCQPut(__FILE__, __LINE__, pcq) + + /* Report that we've just got an element from a FIFO queue at address "pcq". */ +#define _Py_ANNOTATE_PCQ_GET(pcq) \ + AnnotatePCQGet(__FILE__, __LINE__, pcq) + + /* ------------------------------------------------------------- + Annotations that suppress errors. It is usually better to express the + program's synchronization using the other annotations, but these can + be used when all else fails. */ + + /* Report that we may have a benign race at "pointer", with size + "sizeof(*(pointer))". "pointer" must be a non-void* pointer. Insert at the + point where "pointer" has been allocated, preferably close to the point + where the race happens. See also _Py_ANNOTATE_BENIGN_RACE_STATIC. */ +#define _Py_ANNOTATE_BENIGN_RACE(pointer, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, pointer, \ + sizeof(*(pointer)), description) + + /* Same as _Py_ANNOTATE_BENIGN_RACE(address, description), but applies to + the memory range [address, address+size). */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description) + + /* Request the analysis tool to ignore all reads in the current thread + until _Py_ANNOTATE_IGNORE_READS_END is called. + Useful to ignore intentional racey reads, while still checking + other reads and all writes. + See also _Py_ANNOTATE_UNPROTECTED_READ. */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() \ + AnnotateIgnoreReadsBegin(__FILE__, __LINE__) + + /* Stop ignoring reads. */ +#define _Py_ANNOTATE_IGNORE_READS_END() \ + AnnotateIgnoreReadsEnd(__FILE__, __LINE__) + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() \ + AnnotateIgnoreWritesBegin(__FILE__, __LINE__) + + /* Stop ignoring writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() \ + AnnotateIgnoreWritesEnd(__FILE__, __LINE__) + + /* Start ignoring all memory accesses (reads and writes). */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \ + do {\ + _Py_ANNOTATE_IGNORE_READS_BEGIN();\ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN();\ + }while(0)\ + + /* Stop ignoring all memory accesses. */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() \ + do {\ + _Py_ANNOTATE_IGNORE_WRITES_END();\ + _Py_ANNOTATE_IGNORE_READS_END();\ + }while(0)\ + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore synchronization events: + RWLOCK* and CONDVAR*. */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() \ + AnnotateIgnoreSyncBegin(__FILE__, __LINE__) + + /* Stop ignoring sync events. */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() \ + AnnotateIgnoreSyncEnd(__FILE__, __LINE__) + + + /* Enable (enable!=0) or disable (enable==0) race detection for all threads. + This annotation could be useful if you want to skip expensive race analysis + during some period of program execution, e.g. during initialization. */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) \ + AnnotateEnableRaceDetection(__FILE__, __LINE__, enable) + + /* ------------------------------------------------------------- + Annotations useful for debugging. */ + + /* Request to trace every access to "address". */ +#define _Py_ANNOTATE_TRACE_MEMORY(address) \ + AnnotateTraceMemory(__FILE__, __LINE__, address) + + /* Report the current thread name to a race detector. */ +#define _Py_ANNOTATE_THREAD_NAME(name) \ + AnnotateThreadName(__FILE__, __LINE__, name) + + /* ------------------------------------------------------------- + Annotations useful when implementing locks. They are not + normally needed by modules that merely use locks. + The "lock" argument is a pointer to the lock object. */ + + /* Report that a lock has been created at address "lock". */ +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) \ + AnnotateRWLockCreate(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" is about to be destroyed. */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) \ + AnnotateRWLockDestroy(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" has been acquired. + is_w=1 for writer lock, is_w=0 for reader lock. */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \ + AnnotateRWLockAcquired(__FILE__, __LINE__, lock, is_w) + + /* Report that the lock at address "lock" is about to be released. */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) \ + AnnotateRWLockReleased(__FILE__, __LINE__, lock, is_w) + + /* ------------------------------------------------------------- + Annotations useful when implementing barriers. They are not + normally needed by modules that merely use barriers. + The "barrier" argument is a pointer to the barrier object. */ + + /* Report that the "barrier" has been initialized with initial "count". + If 'reinitialization_allowed' is true, initialization is allowed to happen + multiple times w/o calling barrier_destroy() */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \ + AnnotateBarrierInit(__FILE__, __LINE__, barrier, count, \ + reinitialization_allowed) + + /* Report that we are about to enter barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \ + AnnotateBarrierWaitBefore(__FILE__, __LINE__, barrier) + + /* Report that we just exited barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) \ + AnnotateBarrierWaitAfter(__FILE__, __LINE__, barrier) + + /* Report that the "barrier" has been destroyed. */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) \ + AnnotateBarrierDestroy(__FILE__, __LINE__, barrier) + + /* ------------------------------------------------------------- + Annotations useful for testing race detectors. */ + + /* Report that we expect a race on the variable at "address". + Use only in unit tests for a race detector. */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) \ + AnnotateExpectRace(__FILE__, __LINE__, address, description) + + /* A no-op. Insert where you like to test the interceptors. */ +#define _Py_ANNOTATE_NO_OP(arg) \ + AnnotateNoOp(__FILE__, __LINE__, arg) + + /* Force the race detector to flush its state. The actual effect depends on + * the implementation of the detector. */ +#define _Py_ANNOTATE_FLUSH_STATE() \ + AnnotateFlushState(__FILE__, __LINE__) + + +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) /* */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) /* empty */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) /* empty */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) /* empty */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) /* empty */ +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) /* empty */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_UNPUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_SWAP_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_GET(pcq) /* empty */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) /* empty */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) /* empty */ +#define _Py_ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) /* empty */ +#define _Py_ANNOTATE_TRACE_MEMORY(arg) /* empty */ +#define _Py_ANNOTATE_THREAD_NAME(name) /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() /* empty */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */ +#define _Py_ANNOTATE_NO_OP(arg) /* empty */ +#define _Py_ANNOTATE_FLUSH_STATE() /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +/* Use the macros above rather than using these functions directly. */ +#ifdef __cplusplus +extern "C" { +#endif +void AnnotateRWLockCreate(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockDestroy(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockAcquired(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateRWLockReleased(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateBarrierInit(const char *file, int line, + const volatile void *barrier, long count, + long reinitialization_allowed); +void AnnotateBarrierWaitBefore(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierWaitAfter(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierDestroy(const char *file, int line, + const volatile void *barrier); +void AnnotateCondVarWait(const char *file, int line, + const volatile void *cv, + const volatile void *lock); +void AnnotateCondVarSignal(const char *file, int line, + const volatile void *cv); +void AnnotateCondVarSignalAll(const char *file, int line, + const volatile void *cv); +void AnnotatePublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotateUnpublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotatePCQCreate(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQDestroy(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQPut(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQGet(const char *file, int line, + const volatile void *pcq); +void AnnotateNewMemory(const char *file, int line, + const volatile void *address, + long size); +void AnnotateExpectRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRaceSized(const char *file, int line, + const volatile void *address, + long size, + const char *description); +void AnnotateMutexIsUsedAsCondVar(const char *file, int line, + const volatile void *mu); +void AnnotateTraceMemory(const char *file, int line, + const volatile void *arg); +void AnnotateThreadName(const char *file, int line, + const char *name); +void AnnotateIgnoreReadsBegin(const char *file, int line); +void AnnotateIgnoreReadsEnd(const char *file, int line); +void AnnotateIgnoreWritesBegin(const char *file, int line); +void AnnotateIgnoreWritesEnd(const char *file, int line); +void AnnotateEnableRaceDetection(const char *file, int line, int enable); +void AnnotateNoOp(const char *file, int line, + const volatile void *arg); +void AnnotateFlushState(const char *file, int line); + +/* Return non-zero value if running under valgrind. + + If "valgrind.h" is included into dynamic_annotations.c, + the regular valgrind mechanism will be used. + See http://valgrind.org/docs/manual/manual-core-adv.html about + RUNNING_ON_VALGRIND and other valgrind "client requests". + The file "valgrind.h" may be obtained by doing + svn co svn://svn.valgrind.org/valgrind/trunk/include + + If for some reason you can't use "valgrind.h" or want to fake valgrind, + there are two ways to make this function return non-zero: + - Use environment variable: export RUNNING_ON_VALGRIND=1 + - Make your tool intercept the function RunningOnValgrind() and + change its return value. + */ +int RunningOnValgrind(void); + +#ifdef __cplusplus +} +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus) + + /* _Py_ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads. + + Instead of doing + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + ... = x; + _Py_ANNOTATE_IGNORE_READS_END(); + one can use + ... = _Py_ANNOTATE_UNPROTECTED_READ(x); */ + template + inline T _Py_ANNOTATE_UNPROTECTED_READ(const volatile T &x) { + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + T res = x; + _Py_ANNOTATE_IGNORE_READS_END(); + return res; + } + /* Apply _Py_ANNOTATE_BENIGN_RACE_SIZED to a static variable. */ +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \ + namespace { \ + class static_var ## _annotator { \ + public: \ + static_var ## _annotator() { \ + _Py_ANNOTATE_BENIGN_RACE_SIZED(&static_var, \ + sizeof(static_var), \ + # static_var ": " description); \ + } \ + }; \ + static static_var ## _annotator the ## static_var ## _annotator;\ + } +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_UNPROTECTED_READ(x) (x) +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +#endif /* __DYNAMIC_ANNOTATIONS_H__ */ diff --git a/flaskwebproject/FlaskWebProject1/Include/enumobject.h b/flaskwebproject/FlaskWebProject1/Include/enumobject.h new file mode 100644 index 0000000..c14dbfc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/enumobject.h @@ -0,0 +1,17 @@ +#ifndef Py_ENUMOBJECT_H +#define Py_ENUMOBJECT_H + +/* Enumerate Object */ + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyEnum_Type; +PyAPI_DATA(PyTypeObject) PyReversed_Type; + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_ENUMOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/errcode.h b/flaskwebproject/FlaskWebProject1/Include/errcode.h new file mode 100644 index 0000000..5946686 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/errcode.h @@ -0,0 +1,38 @@ +#ifndef Py_ERRCODE_H +#define Py_ERRCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Error codes passed around between file input, tokenizer, parser and + interpreter. This is necessary so we can turn them into Python + exceptions at a higher level. Note that some errors have a + slightly different meaning when passed from the tokenizer to the + parser than when passed from the parser to the interpreter; e.g. + the parser only returns E_EOF when it hits EOF immediately, and it + never returns E_OK. */ + +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ +#define E_IDENTIFIER 26 /* Invalid characters in identifier */ +#define E_BADSINGLE 27 /* Ill-formed single statement input */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRCODE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/eval.h b/flaskwebproject/FlaskWebProject1/Include/eval.h new file mode 100644 index 0000000..a1c6e81 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/eval.h @@ -0,0 +1,27 @@ + +/* Interface to execute compiled code */ + +#ifndef Py_EVAL_H +#define Py_EVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, + PyObject *globals, + PyObject *locals, + PyObject **args, int argc, + PyObject **kwds, int kwdc, + PyObject **defs, int defc, + PyObject *kwdefs, PyObject *closure); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_EVAL_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/fileobject.h b/flaskwebproject/FlaskWebProject1/Include/fileobject.h new file mode 100644 index 0000000..1dde17e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/fileobject.h @@ -0,0 +1,50 @@ +/* File object interface (what's left of it -- see io.py) */ + +#ifndef Py_FILEOBJECT_H +#define Py_FILEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PY_STDIOTEXTMODE "b" + +PyAPI_FUNC(PyObject *) PyFile_FromFd(int, const char *, const char *, int, + const char *, const char *, + const char *, int); +PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); +PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); +#endif + +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif +PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; + +/* Internal API + + The std printer acts as a preliminary sys.stderr until the new io + infrastructure is in place. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); +PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; +#endif /* Py_LIMITED_API */ + +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef HAVE_SELECT + #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) +#else + #define _PyIsSelectable_fd(FD) (1) +#endif /* HAVE_SELECT */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FILEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/fileutils.h b/flaskwebproject/FlaskWebProject1/Include/fileutils.h new file mode 100644 index 0000000..9fce7d2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/fileutils.h @@ -0,0 +1,146 @@ +#ifndef Py_FILEUTILS_H +#define Py_FILEUTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(wchar_t *) Py_DecodeLocale( + const char *arg, + size_t *size); + +PyAPI_FUNC(char*) Py_EncodeLocale( + const wchar_t *text, + size_t *error_pos); +#endif + +#ifndef Py_LIMITED_API + +PyAPI_FUNC(wchar_t *) _Py_DecodeLocaleEx( + const char *arg, + size_t *size, + int current_locale); + +PyAPI_FUNC(char*) _Py_EncodeLocaleEx( + const wchar_t *text, + size_t *error_pos, + int current_locale); + +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +PyAPI_FUNC(FILE *) _Py_wfopen( + const wchar_t *path, + const wchar_t *mode); + +PyAPI_FUNC(FILE*) _Py_fopen( + const char *pathname, + const char *mode); + +PyAPI_FUNC(FILE*) _Py_fopen_obj( + PyObject *path, + const char *mode); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + size_t bufsiz); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + size_t resolved_path_size); +#endif + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + size_t size); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ + +PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( + PyObject **decimal_point, + PyObject **thousands_sep, + const char **grouping); + +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_FILEUTILS_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/floatobject.h b/flaskwebproject/FlaskWebProject1/Include/floatobject.h new file mode 100644 index 0000000..f1044d6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/floatobject.h @@ -0,0 +1,130 @@ + +/* Float object interface */ + +/* +PyFloatObject represents a (double precision) floating point number. +*/ + +#ifndef Py_FLOATOBJECT_H +#define Py_FLOATOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + double ob_fval; +} PyFloatObject; +#endif + +PyAPI_DATA(PyTypeObject) PyFloat_Type; + +#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) + +#ifdef Py_NAN +#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) +#endif + +#define Py_RETURN_INF(sign) do \ + if (copysign(1., sign) == 1.) { \ + return PyFloat_FromDouble(Py_HUGE_VAL); \ + } else { \ + return PyFloat_FromDouble(-Py_HUGE_VAL); \ + } while(0) + +PyAPI_FUNC(double) PyFloat_GetMax(void); +PyAPI_FUNC(double) PyFloat_GetMin(void); +PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void); + +/* Return Python float from string PyObject. */ +PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*); + +/* Return Python float from C double. */ +PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double); + +/* Extract C double from Python float. The macro version trades safety for + speed. */ +PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *); +#ifndef Py_LIMITED_API +#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval) +#endif + +#ifndef Py_LIMITED_API +/* _PyFloat_{Pack,Unpack}{4,8} + * + * The struct and pickle (at least) modules need an efficient platform- + * independent way to store floating-point values as byte strings. + * The Pack routines produce a string from a C double, and the Unpack + * routines produce a C double from such a string. The suffix (4 or 8) + * specifies the number of bytes in the string. + * + * On platforms that appear to use (see _PyFloat_Init()) IEEE-754 formats + * these functions work by copying bits. On other platforms, the formats the + * 4- byte format is identical to the IEEE-754 single precision format, and + * the 8-byte format to the IEEE-754 double precision format, although the + * packing of INFs and NaNs (if such things exist on the platform) isn't + * handled correctly, and attempting to unpack a string containing an IEEE + * INF or NaN will raise an exception. + * + * On non-IEEE platforms with more precision, or larger dynamic range, than + * 754 supports, not all values can be packed; on non-IEEE platforms with less + * precision, or smaller dynamic range, not all values can be unpacked. What + * happens in such cases is partly accidental (alas). + */ + +/* The pack routines write 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if you want the string in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if you want big-endian format (exponent + * first, at p). + * Return value: 0 if all is OK, -1 if error (and an exception is + * set, most likely OverflowError). + * There are two problems on non-IEEE platforms: + * 1): What this does is undefined if x is a NaN or infinity. + * 2): -0.0 and +0.0 produce the same string. + */ +PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); + +/* Needed for the old way for marshal to store a floating point number. + Returns the string length copied into p, -1 on error. + */ +PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); + +/* Used to get the important decimal digits of a double */ +PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); +PyAPI_FUNC(void) _PyFloat_DigitsInit(void); + +/* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if the string is in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). + * Return value: The unpacked double. On error, this is -1.0 and + * PyErr_Occurred() is true (and an exception is set, most likely + * OverflowError). Note that on a non-IEEE platform this will refuse + * to unpack a string that represents a NaN or infinity. + */ +PyAPI_FUNC(double) _PyFloat_Unpack2(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); + +/* free list api */ +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FLOATOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/frameobject.h b/flaskwebproject/FlaskWebProject1/Include/frameobject.h new file mode 100644 index 0000000..00c5093 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/frameobject.h @@ -0,0 +1,95 @@ + +/* Frame object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_FRAMEOBJECT_H +#define Py_FRAMEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + + /* In a generator, we need to be able to swap between the exception + state inside the generator and the exception state of the calling + frame (which shouldn't be impacted when the generator "yields" + from an except handler). + These three fields exist exactly for that, and are unused for + non-generator frames. See the save_exc_state and swap_exc_state + functions in ceval.c for details of their use. */ + PyObject *f_exc_type, *f_exc_value, *f_exc_traceback; + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Extend the value stack */ + +PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FRAMEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/funcobject.h b/flaskwebproject/FlaskWebProject1/Include/funcobject.h new file mode 100644 index 0000000..77bb8c3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/funcobject.h @@ -0,0 +1,103 @@ + +/* Function object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_FUNCOBJECT_H +#define Py_FUNCOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Function objects and code objects should not be confused with each other: + * + * Function objects are created by the execution of the 'def' statement. + * They reference a code object in their __code__ attribute, which is a + * purely syntactic object, i.e. nothing more than a compiled version of some + * source code lines. There is one code object per source code "fragment", + * but each code object can be referenced by zero or many function objects + * depending only on how many times the 'def' statement in the source was + * executed so far. + */ + +typedef struct { + PyObject_HEAD + PyObject *func_code; /* A code object, the __code__ attribute */ + PyObject *func_globals; /* A dictionary (other mappings won't do) */ + PyObject *func_defaults; /* NULL or a tuple */ + PyObject *func_kwdefaults; /* NULL or a dict */ + PyObject *func_closure; /* NULL or a tuple of cell objects */ + PyObject *func_doc; /* The __doc__ attribute, can be anything */ + PyObject *func_name; /* The __name__ attribute, a string object */ + PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ + PyObject *func_weakreflist; /* List of weak references */ + PyObject *func_module; /* The __module__ attribute, can be anything */ + PyObject *func_annotations; /* Annotations, a dict or NULL */ + PyObject *func_qualname; /* The qualified name */ + + /* Invariant: + * func_closure contains the bindings for func_code->co_freevars, so + * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) + * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). + */ +} PyFunctionObject; + +PyAPI_DATA(PyTypeObject) PyFunction_Type; + +#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) + +PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); +PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); +PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( + PyObject *func, + PyObject **args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords( + PyObject *func, + PyObject **stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyFunction_GET_CODE(func) \ + (((PyFunctionObject *)func) -> func_code) +#define PyFunction_GET_GLOBALS(func) \ + (((PyFunctionObject *)func) -> func_globals) +#define PyFunction_GET_MODULE(func) \ + (((PyFunctionObject *)func) -> func_module) +#define PyFunction_GET_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_defaults) +#define PyFunction_GET_KW_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_kwdefaults) +#define PyFunction_GET_CLOSURE(func) \ + (((PyFunctionObject *)func) -> func_closure) +#define PyFunction_GET_ANNOTATIONS(func) \ + (((PyFunctionObject *)func) -> func_annotations) + +/* The classmethod and staticmethod types lives here, too */ +PyAPI_DATA(PyTypeObject) PyClassMethod_Type; +PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; + +PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FUNCOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/genobject.h b/flaskwebproject/FlaskWebProject1/Include/genobject.h new file mode 100644 index 0000000..8c1825f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/genobject.h @@ -0,0 +1,104 @@ + +/* Generator object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_GENOBJECT_H +#define Py_GENOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; /* Avoid including frameobject.h */ + +/* _PyGenObject_HEAD defines the initial segment of generator + and coroutine objects. */ +#define _PyGenObject_HEAD(prefix) \ + PyObject_HEAD \ + /* Note: gi_frame can be NULL if the generator is "finished" */ \ + struct _frame *prefix##_frame; \ + /* True if generator is being executed. */ \ + char prefix##_running; \ + /* The code object backing the generator */ \ + PyObject *prefix##_code; \ + /* List of weak reference. */ \ + PyObject *prefix##_weakreflist; \ + /* Name of the generator. */ \ + PyObject *prefix##_name; \ + /* Qualified name of the generator. */ \ + PyObject *prefix##_qualname; + +typedef struct { + /* The gi_ prefix is intended to remind of generator-iterator. */ + _PyGenObject_HEAD(gi) +} PyGenObject; + +PyAPI_DATA(PyTypeObject) PyGen_Type; + +#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) +#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) + +PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); +PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, + PyObject *name, PyObject *qualname); +PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); +PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); +PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); +PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); +PyObject *_PyGen_yf(PyGenObject *); +PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); + +#ifndef Py_LIMITED_API +typedef struct { + _PyGenObject_HEAD(cr) +} PyCoroObject; + +PyAPI_DATA(PyTypeObject) PyCoro_Type; +PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; + +PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; +PyObject *_PyAIterWrapper_New(PyObject *aiter); + +#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +PyObject *_PyCoro_GetAwaitableIter(PyObject *o); +PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, + PyObject *name, PyObject *qualname); + +/* Asynchronous Generators */ + +typedef struct { + _PyGenObject_HEAD(ag) + PyObject *ag_finalizer; + + /* Flag is set to 1 when hooks set up by sys.set_asyncgen_hooks + were called on the generator, to avoid calling them more + than once. */ + int ag_hooks_inited; + + /* Flag is set to 1 when aclose() is called for the first time, or + when a StopAsyncIteration exception is raised. */ + int ag_closed; +} PyAsyncGenObject; + +PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; + +PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, + PyObject *name, PyObject *qualname); + +#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) + +PyObject *_PyAsyncGenValueWrapperNew(PyObject *); + +int PyAsyncGen_ClearFreeLists(void); + +#endif + +#undef _PyGenObject_HEAD + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/graminit.h b/flaskwebproject/FlaskWebProject1/Include/graminit.h new file mode 100644 index 0000000..e9b4a93 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/graminit.h @@ -0,0 +1,88 @@ +/* Generated by Parser/pgen */ + +#define single_input 256 +#define file_input 257 +#define eval_input 258 +#define decorator 259 +#define decorators 260 +#define decorated 261 +#define async_funcdef 262 +#define funcdef 263 +#define parameters 264 +#define typedargslist 265 +#define tfpdef 266 +#define varargslist 267 +#define vfpdef 268 +#define stmt 269 +#define simple_stmt 270 +#define small_stmt 271 +#define expr_stmt 272 +#define annassign 273 +#define testlist_star_expr 274 +#define augassign 275 +#define del_stmt 276 +#define pass_stmt 277 +#define flow_stmt 278 +#define break_stmt 279 +#define continue_stmt 280 +#define return_stmt 281 +#define yield_stmt 282 +#define raise_stmt 283 +#define import_stmt 284 +#define import_name 285 +#define import_from 286 +#define import_as_name 287 +#define dotted_as_name 288 +#define import_as_names 289 +#define dotted_as_names 290 +#define dotted_name 291 +#define global_stmt 292 +#define nonlocal_stmt 293 +#define assert_stmt 294 +#define compound_stmt 295 +#define async_stmt 296 +#define if_stmt 297 +#define while_stmt 298 +#define for_stmt 299 +#define try_stmt 300 +#define with_stmt 301 +#define with_item 302 +#define except_clause 303 +#define suite 304 +#define test 305 +#define test_nocond 306 +#define lambdef 307 +#define lambdef_nocond 308 +#define or_test 309 +#define and_test 310 +#define not_test 311 +#define comparison 312 +#define comp_op 313 +#define star_expr 314 +#define expr 315 +#define xor_expr 316 +#define and_expr 317 +#define shift_expr 318 +#define arith_expr 319 +#define term 320 +#define factor 321 +#define power 322 +#define atom_expr 323 +#define atom 324 +#define testlist_comp 325 +#define trailer 326 +#define subscriptlist 327 +#define subscript 328 +#define sliceop 329 +#define exprlist 330 +#define testlist 331 +#define dictorsetmaker 332 +#define classdef 333 +#define arglist 334 +#define argument 335 +#define comp_iter 336 +#define comp_for 337 +#define comp_if 338 +#define encoding_decl 339 +#define yield_expr 340 +#define yield_arg 341 diff --git a/flaskwebproject/FlaskWebProject1/Include/grammar.h b/flaskwebproject/FlaskWebProject1/Include/grammar.h new file mode 100644 index 0000000..f775f96 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/grammar.h @@ -0,0 +1,94 @@ + +/* Grammar interface */ + +#ifndef Py_GRAMMAR_H +#define Py_GRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "bitset.h" /* Sigh... */ + +/* A label of an arc */ + +typedef struct { + int lb_type; + char *lb_str; +} label; + +#define EMPTY 0 /* Label number 0 is by definition the empty label */ + +/* A list of labels */ + +typedef struct { + int ll_nlabels; + label *ll_label; +} labellist; + +/* An arc from one state to another */ + +typedef struct { + short a_lbl; /* Label of this arc */ + short a_arrow; /* State where this arc goes to */ +} arc; + +/* A state in a DFA */ + +typedef struct { + int s_narcs; + arc *s_arc; /* Array of arcs */ + + /* Optional accelerators */ + int s_lower; /* Lowest label index */ + int s_upper; /* Highest label index */ + int *s_accel; /* Accelerator */ + int s_accept; /* Nonzero for accepting state */ +} state; + +/* A DFA */ + +typedef struct { + int d_type; /* Non-terminal this represents */ + char *d_name; /* For printing */ + int d_initial; /* Initial state */ + int d_nstates; + state *d_state; /* Array of states */ + bitset d_first; +} dfa; + +/* A grammar */ + +typedef struct { + int g_ndfas; + dfa *g_dfa; /* Array of DFAs */ + labellist g_ll; + int g_start; /* Start symbol of the grammar */ + int g_accel; /* Set if accelerators present */ +} grammar; + +/* FUNCTIONS */ + +grammar *newgrammar(int start); +void freegrammar(grammar *g); +dfa *adddfa(grammar *g, int type, const char *name); +int addstate(dfa *d); +void addarc(dfa *d, int from, int to, int lbl); +dfa *PyGrammar_FindDFA(grammar *g, int type); + +int addlabel(labellist *ll, int type, const char *str); +int findlabel(labellist *ll, int type, const char *str); +const char *PyGrammar_LabelRepr(label *lb); +void translatelabels(grammar *g); + +void addfirstsets(grammar *g); + +void PyGrammar_AddAccelerators(grammar *g); +void PyGrammar_RemoveAccelerators(grammar *); + +void printgrammar(grammar *g, FILE *fp); +void printnonterminals(grammar *g, FILE *fp); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GRAMMAR_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/import.h b/flaskwebproject/FlaskWebProject1/Include/import.h new file mode 100644 index 0000000..bb6beba --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/import.h @@ -0,0 +1,140 @@ + +/* Module definition and import interface */ + +#ifndef Py_IMPORT_H +#define Py_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyImportZip_Init(void); + +PyMODINIT_FUNC PyInit_imp(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(long) PyImport_GetMagicNumber(void); +PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( + const char *name, /* UTF-8 encoded string */ + PyObject *co + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname, /* decoded from the filesystem encoding */ + const char *cpathname /* decoded from the filesystem encoding */ + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject( + PyObject *name, + PyObject *co, + PyObject *pathname, + PyObject *cpathname + ); +#endif +PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( + PyObject *name + ); +#endif +PyAPI_FUNC(PyObject *) PyImport_AddModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel( + const char *name, /* UTF-8 encoded string */ + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject( + PyObject *name, + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#endif + +#define PyImport_ImportModuleEx(n, g, l, f) \ + PyImport_ImportModuleLevel(n, g, l, f, 0) + +PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); +PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); +PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); +PyAPI_FUNC(void) PyImport_Cleanup(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject( + PyObject *name + ); +#endif +PyAPI_FUNC(int) PyImport_ImportFrozenModule( + const char *name /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +#ifdef WITH_THREAD +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); +#else +#define _PyImport_AcquireLock() +#define _PyImport_ReleaseLock() 1 +#endif + +PyAPI_FUNC(void) _PyImport_ReInitLock(void); + +PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); +PyAPI_FUNC(int) _PyImport_FixupBuiltin( + PyObject *mod, + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, PyObject *); + +struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); +}; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyNullImporter_Type; + +PyAPI_FUNC(int) PyImport_AppendInittab( + const char *name, /* ASCII encoded string */ + PyObject* (*initfunc)(void) + ); + +#ifndef Py_LIMITED_API +struct _frozen { + const char *name; /* ASCII encoded string */ + const unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_IMPORT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/intrcheck.h b/flaskwebproject/FlaskWebProject1/Include/intrcheck.h new file mode 100644 index 0000000..8fb96cf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/intrcheck.h @@ -0,0 +1,24 @@ + +#ifndef Py_INTRCHECK_H +#define Py_INTRCHECK_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_InterruptOccurred(void); +PyAPI_FUNC(void) PyOS_InitInterrupts(void); +PyAPI_FUNC(void) PyOS_AfterFork(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyOS_IsMainThread(void); + +#ifdef MS_WINDOWS +/* windows.h is not included by Python.h so use void* instead of HANDLE */ +PyAPI_FUNC(void*) _PyOS_SigintEvent(void); +#endif +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTRCHECK_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/iterobject.h b/flaskwebproject/FlaskWebProject1/Include/iterobject.h new file mode 100644 index 0000000..f61726f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/iterobject.h @@ -0,0 +1,25 @@ +#ifndef Py_ITEROBJECT_H +#define Py_ITEROBJECT_H +/* Iterators (the basic kind, over a sequence) */ +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PySeqIter_Type; +PyAPI_DATA(PyTypeObject) PyCallIter_Type; +PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; + +#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) + +PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); + + +#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) + +PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ITEROBJECT_H */ + diff --git a/flaskwebproject/FlaskWebProject1/Include/listobject.h b/flaskwebproject/FlaskWebProject1/Include/listobject.h new file mode 100644 index 0000000..31843b5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/listobject.h @@ -0,0 +1,81 @@ + +/* List object interface */ + +/* +Another generally useful object type is a list of object pointers. +This is a mutable type: the list items can be changed, and items can be +added or removed. Out-of-range indices or non-list objects are ignored. + +*** WARNING *** PyList_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the list. Similarly, PyList_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; +#endif + +PyAPI_DATA(PyTypeObject) PyList_Type; +PyAPI_DATA(PyTypeObject) PyListIter_Type; +PyAPI_DATA(PyTypeObject) PyListRevIter_Type; +PyAPI_DATA(PyTypeObject) PySortWrapper_Type; + +#define PyList_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) + +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Sort(PyObject *); +PyAPI_FUNC(int) PyList_Reverse(PyObject *); +PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); + +PyAPI_FUNC(int) PyList_ClearFreeList(void); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) Py_SIZE(op) +#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LISTOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/longintrepr.h b/flaskwebproject/FlaskWebProject1/Include/longintrepr.h new file mode 100644 index 0000000..a3b74b4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/longintrepr.h @@ -0,0 +1,99 @@ +#ifndef Py_LIMITED_API +#ifndef Py_LONGINTREPR_H +#define Py_LONGINTREPR_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* This is published for the benefit of "friends" marshal.c and _decimal.c. */ + +/* Parameters of the integer representation. There are two different + sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit + integer type, and one set for 15-bit digits with each digit stored in an + unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at + configure time or in pyport.h, is used to decide which digit size to use. + + Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' + should be an unsigned integer type able to hold all integers up to + PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, + and that overflow is handled by taking the result modulo 2**N for some N > + PyLong_SHIFT. The majority of the code doesn't care about the precise + value of PyLong_SHIFT, but there are some notable exceptions: + + - long_pow() requires that PyLong_SHIFT be divisible by 5 + + - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 + + - long_hash() requires that PyLong_SHIFT is *strictly* less than the number + of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) + conversion functions + + - the Python int <-> size_t/Py_ssize_t conversion functions expect that + PyLong_SHIFT is strictly less than the number of bits in a size_t + + - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 + + - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single + digit; with the current values this forces PyLong_SHIFT >= 9 + + The values 15 and 30 should fit all of the above requirements, on any + platform. +*/ + +#if PYLONG_BITS_IN_DIGIT == 30 +typedef uint32_t digit; +typedef int32_t sdigit; /* signed variant of digit */ +typedef uint64_t twodigits; +typedef int64_t stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 30 +#define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ +#elif PYLONG_BITS_IN_DIGIT == 15 +typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ +typedef unsigned long twodigits; +typedef long stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 15 +#define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ +#else +#error "PYLONG_BITS_IN_DIGIT should be 15 or 30" +#endif +#define PyLong_BASE ((digit)1 << PyLong_SHIFT) +#define PyLong_MASK ((digit)(PyLong_BASE - 1)) + +#if PyLong_SHIFT % 5 != 0 +#error "longobject.c requires that PyLong_SHIFT be divisible by 5" +#endif + +/* Long integer representation. + The absolute value of a number is equal to + SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) + Negative numbers are represented with ob_size < 0; + zero is represented by ob_size == 0. + In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + digit) is never zero. Also, in all cases, for all valid i, + 0 <= ob_digit[i] <= MASK. + The allocation function takes care of allocating extra memory + so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + + CAUTION: Generic code manipulating subtypes of PyVarObject has to + aware that ints abuse ob_size's sign bit. +*/ + +struct _longobject { + PyObject_VAR_HEAD + digit ob_digit[1]; +}; + +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); + +/* Return a copy of src. */ +PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGINTREPR_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/longobject.h b/flaskwebproject/FlaskWebProject1/Include/longobject.h new file mode 100644 index 0000000..efd409c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/longobject.h @@ -0,0 +1,215 @@ +#ifndef Py_LONGOBJECT_H +#define Py_LONGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Long (arbitrary precision) integer object interface */ + +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ + +PyAPI_DATA(PyTypeObject) PyLong_Type; + +#define PyLong_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) + +PyAPI_FUNC(PyObject *) PyLong_FromLong(long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); +PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); +PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(size_t) PyLong_AsSize_t(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); + +/* It may be useful in the future. I've added it in the PyInt -> PyLong + cleanup to keep the extra information. [CH] */ +#define PyLong_AS_LONG(op) PyLong_AsLong(op) + +/* Issue #1983: pid_t can be longer than a C long on some systems */ +#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT +#define _Py_PARSE_PID "i" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif SIZEOF_PID_T == SIZEOF_LONG +#define _Py_PARSE_PID "l" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG +#define _Py_PARSE_PID "L" +#define PyLong_FromPid PyLong_FromLongLong +#define PyLong_AsPid PyLong_AsLongLong +#else +#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" +#endif /* SIZEOF_PID_T */ + +#if SIZEOF_VOID_P == SIZEOF_INT +# define _Py_PARSE_INTPTR "i" +# define _Py_PARSE_UINTPTR "I" +#elif SIZEOF_VOID_P == SIZEOF_LONG +# define _Py_PARSE_INTPTR "l" +# define _Py_PARSE_UINTPTR "k" +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG +# define _Py_PARSE_INTPTR "L" +# define _Py_PARSE_UINTPTR "K" +#else +# error "void* different in size from int, long and long long" +#endif /* SIZEOF_VOID_P */ + +/* Used by Python/mystrtoul.c, _PyBytes_FromHex(), + _PyBytes_DecodeEscapeRecode(), etc. */ +#ifndef Py_LIMITED_API +PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; +#endif + +/* _PyLong_Frexp returns a double x and an exponent e such that the + true value is approximately equal to x * 2**e. e is >= 0. x is + 0.0 if and only if the input is 0 (in which case, e and x are both + zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is + possible if the number of bits doesn't fit into a Py_ssize_t, sets + OverflowError and returns -1.0 for x, 0 for e. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); +#endif + +PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); +PyAPI_FUNC(void *) PyLong_AsVoidPtr(PyObject *); + +PyAPI_FUNC(PyObject *) PyLong_FromLongLong(long long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLongLong(unsigned long long); +PyAPI_FUNC(long long) PyLong_AsLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLongMask(PyObject *); +PyAPI_FUNC(long long) PyLong_AsLongLongAndOverflow(PyObject *, int *); + +PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); +PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); +PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); +#endif + +#ifndef Py_LIMITED_API +/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. + v must not be NULL, and must be a normalized long. + There are no error cases. +*/ +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + + +/* _PyLong_NumBits. Return the number of bits needed to represent the + absolute value of a long. For example, this returns 1 for 1 and -1, 2 + for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. + v must not be NULL, and must be a normalized long. + (size_t)-1 is returned and OverflowError set if the true result doesn't + fit in a size_t. +*/ +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + +/* _PyLong_DivmodNear. Given integers a and b, compute the nearest + integer q to the exact quotient a / b, rounding to the nearest even integer + in the case of a tie. Return (q, r), where r = a - q*b. The remainder r + will satisfy abs(r) <= abs(b)/2, with equality possible only if q is + even. +*/ +PyAPI_FUNC(PyObject *) _PyLong_DivmodNear(PyObject *, PyObject *); + +/* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in + base 256, and return a Python int with the same numeric value. + If n is 0, the integer is 0. Else: + If little_endian is 1/true, bytes[n-1] is the MSB and bytes[0] the LSB; + else (little_endian is 0/false) bytes[0] is the MSB and bytes[n-1] the + LSB. + If is_signed is 0/false, view the bytes as a non-negative integer. + If is_signed is 1/true, view the bytes as a 2's-complement integer, + non-negative if bit 0x80 of the MSB is clear, negative if set. + Error returns: + + Return NULL with the appropriate exception set if there's not + enough memory to create the Python int. +*/ +PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( + const unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long + v to a base-256 integer, stored in array bytes. Normally return 0, + return -1 on error. + If little_endian is 1/true, store the MSB at bytes[n-1] and the LSB at + bytes[0]; else (little_endian is 0/false) store the MSB at bytes[0] and + the LSB at bytes[n-1]. + If is_signed is 0/false, it's an error if v < 0; else (v >= 0) n bytes + are filled and there's nothing special about bit 0x80 of the MSB. + If is_signed is 1/true, bytes is filled with the 2's-complement + representation of v's value. Bit 0x80 of the MSB is the sign bit. + Error returns (-1): + + is_signed is 0 and v < 0. TypeError is set in this case, and bytes + isn't altered. + + n isn't big enough to hold the full mathematical value of v. For + example, if is_signed is 0 and there are more digits in the v than + fit in n; or if is_signed is 1, v < 0, and n is just 1 bit shy of + being large enough to hold a sign bit. OverflowError is set in this + case, but bytes holds the least-significant n bytes of the true value. +*/ +PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, + unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_FromNbInt: Convert the given object to a PyLongObject + using the nb_int slot, if available. Raise TypeError if either the + nb_int slot is not available or the result of the call to nb_int + returns something not of type int. +*/ +PyAPI_FUNC(PyLongObject *)_PyLong_FromNbInt(PyObject *); + +/* _PyLong_Format: Convert the long to a string object with given base, + appending a base prefix of 0[box] if base is 2, 8 or 16. */ +PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base); + +PyAPI_FUNC(int) _PyLong_FormatWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + int base, + int alternate); + +PyAPI_FUNC(char*) _PyLong_FormatBytesWriter( + _PyBytesWriter *writer, + char *str, + PyObject *obj, + int base, + int alternate); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyLong_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +/* These aren't really part of the int object, but they're handy. The + functions are in Python/mystrtoul.c. + */ +PyAPI_FUNC(unsigned long) PyOS_strtoul(const char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(const char *, char **, int); + +#ifndef Py_LIMITED_API +/* For use by the gcd function in mathmodule.c */ +PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/marshal.h b/flaskwebproject/FlaskWebProject1/Include/marshal.h new file mode 100644 index 0000000..09d9337 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/marshal.h @@ -0,0 +1,28 @@ + +/* Interface for marshal.c */ + +#ifndef Py_MARSHAL_H +#define Py_MARSHAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#define Py_MARSHAL_VERSION 4 + +PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); +PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); +PyAPI_FUNC(PyObject *) PyMarshal_WriteObjectToString(PyObject *, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(long) PyMarshal_ReadLongFromFile(FILE *); +PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); +#endif +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, + Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MARSHAL_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/memoryobject.h b/flaskwebproject/FlaskWebProject1/Include/memoryobject.h new file mode 100644 index 0000000..990a716 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/memoryobject.h @@ -0,0 +1,72 @@ +/* Memory view object. In Python this is available as "memoryview". */ + +#ifndef Py_MEMORYOBJECT_H +#define Py_MEMORYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; +#endif +PyAPI_DATA(PyTypeObject) PyMemoryView_Type; + +#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) + +#ifndef Py_LIMITED_API +/* Get a pointer to the memoryview's private copy of the exporter's buffer. */ +#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view) +/* Get a pointer to the exporting object (this may be NULL!). */ +#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj) +#endif + +PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size, + int flags); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); +#endif +PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, + int buffertype, + char order); + + +/* The structs are declared here so that macros can work, but they shouldn't + be considered public. Don't access their fields directly, use the macros + and functions instead! */ +#ifndef Py_LIMITED_API +#define _Py_MANAGED_BUFFER_RELEASED 0x001 /* access to exporter blocked */ +#define _Py_MANAGED_BUFFER_FREE_FORMAT 0x002 /* free format */ +typedef struct { + PyObject_HEAD + int flags; /* state flags */ + Py_ssize_t exports; /* number of direct memoryview exports */ + Py_buffer master; /* snapshot buffer obtained from the original exporter */ +} _PyManagedBufferObject; + + +/* memoryview state flags */ +#define _Py_MEMORYVIEW_RELEASED 0x001 /* access to master buffer blocked */ +#define _Py_MEMORYVIEW_C 0x002 /* C-contiguous layout */ +#define _Py_MEMORYVIEW_FORTRAN 0x004 /* Fortran contiguous layout */ +#define _Py_MEMORYVIEW_SCALAR 0x008 /* scalar: ndim = 0 */ +#define _Py_MEMORYVIEW_PIL 0x010 /* PIL-style layout */ + +typedef struct { + PyObject_VAR_HEAD + _PyManagedBufferObject *mbuf; /* managed buffer */ + Py_hash_t hash; /* hash value for read-only views */ + int flags; /* state flags */ + Py_ssize_t exports; /* number of buffer re-exports */ + Py_buffer view; /* private copy of the exporter's view */ + PyObject *weakreflist; + Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */ +} PyMemoryViewObject; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MEMORYOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/metagrammar.h b/flaskwebproject/FlaskWebProject1/Include/metagrammar.h new file mode 100644 index 0000000..15c8ef8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/metagrammar.h @@ -0,0 +1,18 @@ +#ifndef Py_METAGRAMMAR_H +#define Py_METAGRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + + +#define MSTART 256 +#define RULE 257 +#define RHS 258 +#define ALT 259 +#define ITEM 260 +#define ATOM 261 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METAGRAMMAR_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/methodobject.h b/flaskwebproject/FlaskWebProject1/Include/methodobject.h new file mode 100644 index 0000000..79fad82 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/methodobject.h @@ -0,0 +1,110 @@ + +/* Method object interface */ + +#ifndef Py_METHODOBJECT_H +#define Py_METHODOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'builtin_function_or_method', + not Python methods in user-defined classes. See classobject.h + for the latter. */ + +PyAPI_DATA(PyTypeObject) PyCFunction_Type; + +#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) + +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +typedef PyObject *(*_PyCFunctionFast) (PyObject *self, PyObject **args, + Py_ssize_t nargs, PyObject *kwnames); +typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, + PyObject *); +typedef PyObject *(*PyNoArgsFunction)(PyObject *); + +PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); +PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); +PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#ifndef Py_LIMITED_API +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ + NULL : ((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +#endif +PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, + PyObject **args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallKeywords(PyObject *func, + PyObject **stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +struct PyMethodDef { + const char *ml_name; /* The name of the built-in function/method */ + PyCFunction ml_meth; /* The C function that implements it */ + int ml_flags; /* Combination of METH_xxx flags, which mostly + describe the args expected by the C func */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ +}; +typedef struct PyMethodDef PyMethodDef; + +#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) +PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, + PyObject *); + +/* Flag passed to newmethodobject */ +/* #define METH_OLDARGS 0x0000 -- unsupported now */ +#define METH_VARARGS 0x0001 +#define METH_KEYWORDS 0x0002 +/* METH_NOARGS and METH_O must not be combined with the flags above. */ +#define METH_NOARGS 0x0004 +#define METH_O 0x0008 + +/* METH_CLASS and METH_STATIC are a little different; these control + the construction of methods for a class. These cannot be used for + functions in modules. */ +#define METH_CLASS 0x0010 +#define METH_STATIC 0x0020 + +/* METH_COEXIST allows a method to be entered even though a slot has + already filled the entry. When defined, the flag allows a separate + method, "__contains__" for example, to coexist with a defined + slot like sq_contains. */ + +#define METH_COEXIST 0x0040 + +#ifndef Py_LIMITED_API +#define METH_FASTCALL 0x0080 + +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ + PyObject *m_weakreflist; /* List of weak references */ +} PyCFunctionObject; +#endif + +PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); +PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METHODOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/modsupport.h b/flaskwebproject/FlaskWebProject1/Include/modsupport.h new file mode 100644 index 0000000..86719c6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/modsupport.h @@ -0,0 +1,183 @@ + +#ifndef Py_MODSUPPORT_H +#define Py_MODSUPPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Module support interface */ + +#include + +/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SSIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define Py_BuildValue _Py_BuildValue_SizeT +#define Py_VaBuildValue _Py_VaBuildValue_SizeT +#else +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +#endif /* !Py_LIMITED_API */ +#endif + +/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */ +#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, ...); +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, va_list); +#endif +PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw); +PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); +#endif +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); + +#ifndef Py_LIMITED_API +typedef struct _PyArg_Parser { + const char *format; + const char * const *keywords; + const char *fname; + const char *custom_msg; + int pos; /* number of positional-only arguments */ + int min; /* minimal number of arguments */ + int max; /* maximal number of positional arguments */ + PyObject *kwtuple; /* tuple of keyword parameter names */ + struct _PyArg_Parser *next; +} _PyArg_Parser; +#ifdef PY_SSIZE_T_CLEAN +#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT +#define _PyArg_ParseStack _PyArg_ParseStack_SizeT +#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT +#endif +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, ...); +PyAPI_FUNC(int) _PyArg_ParseStack(PyObject **args, Py_ssize_t nargs, PyObject *kwnames, + struct _PyArg_Parser *, ...); +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, va_list); +void _PyArg_Fini(void); +#endif + +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) +#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(int) PyModule_SetDocString(PyObject *, const char *); +PyAPI_FUNC(int) PyModule_AddFunctions(PyObject *, PyMethodDef *); +PyAPI_FUNC(int) PyModule_ExecDef(PyObject *module, PyModuleDef *def); +#endif + +#define Py_CLEANUP_SUPPORTED 0x20000 + +#define PYTHON_API_VERSION 1013 +#define PYTHON_API_STRING "1013" +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. These are diagnosed by an error message but + the module is still loaded (because the mismatch can only be tested + after loading the module). The error message is intended to + explain the core dump a few seconds later. + + The symbol PYTHON_API_STRING defines the same value as a string + literal. *** PLEASE MAKE SURE THE DEFINITIONS MATCH. *** + + Please add a line or two to the top of this log for each API + version change: + + 22-Feb-2006 MvL 1013 PEP 353 - long indices for sequence lengths + + 19-Aug-2002 GvR 1012 Changes to string object struct for + interning changes, saving 3 bytes. + + 17-Jul-2001 GvR 1011 Descr-branch, just to be on the safe side + + 25-Jan-2001 FLD 1010 Parameters added to PyCode_New() and + PyFrame_New(); Python 2.1a2 + + 14-Mar-2000 GvR 1009 Unicode API added + + 3-Jan-1999 GvR 1007 Decided to change back! (Don't reuse 1008!) + + 3-Dec-1998 GvR 1008 Python 1.5.2b1 + + 18-Jan-1997 GvR 1007 string interning and other speedups + + 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-( + + 30-Jul-1996 GvR Slice and ellipses syntax added + + 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-) + + 7-Nov-1995 GvR Keyword arguments (should've been done at 1.3 :-( ) + + 10-Jan-1995 GvR Renamed globals to new naming scheme + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +/* The PYTHON_ABI_VERSION is introduced in PEP 384. For the lifetime of + Python 3, it will stay at the value of 3; changes to the limited API + must be performed in a strictly backwards-compatible manner. */ +#define PYTHON_ABI_VERSION 3 +#define PYTHON_ABI_STRING "3" + +#ifdef Py_TRACE_REFS + /* When we are tracing reference counts, rename module creation functions so + modules compiled with incompatible settings will generate a + link-time error. */ + #define PyModule_Create2 PyModule_Create2TraceRefs + #define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs +#endif + +PyAPI_FUNC(PyObject *) PyModule_Create2(struct PyModuleDef*, + int apiver); + +#ifdef Py_LIMITED_API +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_ABI_VERSION) +#else +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_API_VERSION) +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModule_FromDefAndSpec2(PyModuleDef *def, + PyObject *spec, + int module_api_version); + +#ifdef Py_LIMITED_API +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_ABI_VERSION) +#else +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_API_VERSION) +#endif /* Py_LIMITED_API */ +#endif /* New in 3.5 */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(char *) _Py_PackageContext; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODSUPPORT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/moduleobject.h b/flaskwebproject/FlaskWebProject1/Include/moduleobject.h new file mode 100644 index 0000000..b6e4933 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/moduleobject.h @@ -0,0 +1,89 @@ + +/* Module object interface */ + +#ifndef Py_MODULEOBJECT_H +#define Py_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyModule_Type; + +#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) +#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_NewObject( + PyObject *name + ); +#endif +PyAPI_FUNC(PyObject *) PyModule_New( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *); +#endif +PyAPI_FUNC(const char *) PyModule_GetName(PyObject *); +PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *); +PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyModule_Clear(PyObject *); +PyAPI_FUNC(void) _PyModule_ClearDict(PyObject *); +#endif +PyAPI_FUNC(struct PyModuleDef*) PyModule_GetDef(PyObject*); +PyAPI_FUNC(void*) PyModule_GetState(PyObject*); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModuleDef_Init(struct PyModuleDef*); +PyAPI_DATA(PyTypeObject) PyModuleDef_Type; +#endif + +typedef struct PyModuleDef_Base { + PyObject_HEAD + PyObject* (*m_init)(void); + Py_ssize_t m_index; + PyObject* m_copy; +} PyModuleDef_Base; + +#define PyModuleDef_HEAD_INIT { \ + PyObject_HEAD_INIT(NULL) \ + NULL, /* m_init */ \ + 0, /* m_index */ \ + NULL, /* m_copy */ \ + } + +struct PyModuleDef_Slot; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +typedef struct PyModuleDef_Slot{ + int slot; + void *value; +} PyModuleDef_Slot; + +#define Py_mod_create 1 +#define Py_mod_exec 2 + +#ifndef Py_LIMITED_API +#define _Py_mod_LAST_SLOT 2 +#endif + +#endif /* New in 3.5 */ + +typedef struct PyModuleDef{ + PyModuleDef_Base m_base; + const char* m_name; + const char* m_doc; + Py_ssize_t m_size; + PyMethodDef *m_methods; + struct PyModuleDef_Slot* m_slots; + traverseproc m_traverse; + inquiry m_clear; + freefunc m_free; +} PyModuleDef; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODULEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/namespaceobject.h b/flaskwebproject/FlaskWebProject1/Include/namespaceobject.h new file mode 100644 index 0000000..0c8d95c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/namespaceobject.h @@ -0,0 +1,19 @@ + +/* simple namespace object interface */ + +#ifndef NAMESPACEOBJECT_H +#define NAMESPACEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNamespace_Type; + +PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !NAMESPACEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/node.h b/flaskwebproject/FlaskWebProject1/Include/node.h new file mode 100644 index 0000000..654ad85 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/node.h @@ -0,0 +1,44 @@ + +/* Parse tree node interface */ + +#ifndef Py_NODE_H +#define Py_NODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _node { + short n_type; + char *n_str; + int n_lineno; + int n_col_offset; + int n_nchildren; + struct _node *n_child; +} node; + +PyAPI_FUNC(node *) PyNode_New(int type); +PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); +PyAPI_FUNC(void) PyNode_Free(node *n); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); +#endif + +/* Node access functions */ +#define NCH(n) ((n)->n_nchildren) + +#define CHILD(n, i) (&(n)->n_child[i]) +#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) +#define TYPE(n) ((n)->n_type) +#define STR(n) ((n)->n_str) +#define LINENO(n) ((n)->n_lineno) + +/* Assert that the type of a node is what we expect */ +#define REQ(n, type) assert(TYPE(n) == (type)) + +PyAPI_FUNC(void) PyNode_ListTree(node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_NODE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/object.h b/flaskwebproject/FlaskWebProject1/Include/object.h new file mode 100644 index 0000000..63e37b8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/object.h @@ -0,0 +1,1077 @@ +#ifndef Py_OBJECT_H +#define Py_OBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Object and type object interface */ + +/* +Objects are structures allocated on the heap. Special rules apply to +the use of objects to ensure they are properly garbage-collected. +Objects are never allocated statically or on the stack; they must be +accessed through special macros and functions only. (Type objects are +exceptions to the first rule; the standard types are represented by +statically initialized type objects, although work on type/class unification +for Python 2.2 made it possible to have heap-allocated type objects too). + +An object has a 'reference count' that is increased or decreased when a +pointer to the object is copied or deleted; when the reference count +reaches zero there are no references to the object left and it can be +removed from the heap. + +An object has a 'type' that determines what it represents and what kind +of data it contains. An object's type is fixed when it is created. +Types themselves are represented as objects; an object contains a +pointer to the corresponding type object. The type itself has a type +pointer pointing to the object representing the type 'type', which +contains a pointer to itself!). + +Objects do not float around in memory; once allocated an object keeps +the same size and address. Objects that must hold variable-size data +can contain pointers to variable-size parts of the object. Not all +objects of the same type have the same size; but the size cannot change +after allocation. (These restrictions are made so a reference to an +object can be simply a pointer -- moving an object would require +updating all the pointers, and changing an object's size would require +moving it if there was another object right next to it.) + +Objects are always accessed through pointers of the type 'PyObject *'. +The type 'PyObject' is a structure that only contains the reference count +and the type pointer. The actual memory allocated for an object +contains other data that can only be accessed after casting the pointer +to a pointer to a longer structure type. This longer type must start +with the reference count and type fields; the macro PyObject_HEAD should be +used for this (to accommodate for future changes). The implementation +of a particular object type can cast the object pointer to the proper +type and back. + +A standard interface exists for objects that contain an array of items +whose size is determined when the object is allocated. +*/ + +/* Py_DEBUG implies Py_TRACE_REFS. */ +#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) +#define Py_TRACE_REFS +#endif + +/* Py_TRACE_REFS implies Py_REF_DEBUG. */ +#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) +#define Py_REF_DEBUG +#endif + +#if defined(Py_LIMITED_API) && defined(Py_REF_DEBUG) +#error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG +#endif + + +#ifdef Py_TRACE_REFS +/* Define pointers to support a doubly-linked list of all live heap objects. */ +#define _PyObject_HEAD_EXTRA \ + struct _object *_ob_next; \ + struct _object *_ob_prev; + +#define _PyObject_EXTRA_INIT 0, 0, + +#else +#define _PyObject_HEAD_EXTRA +#define _PyObject_EXTRA_INIT +#endif + +/* PyObject_HEAD defines the initial segment of every PyObject. */ +#define PyObject_HEAD PyObject ob_base; + +#define PyObject_HEAD_INIT(type) \ + { _PyObject_EXTRA_INIT \ + 1, type }, + +#define PyVarObject_HEAD_INIT(type, size) \ + { PyObject_HEAD_INIT(type) size }, + +/* PyObject_VAR_HEAD defines the initial segment of all variable-size + * container objects. These end with a declaration of an array with 1 + * element, but enough space is malloc'ed so that the array actually + * has room for ob_size elements. Note that ob_size is an element count, + * not necessarily a byte count. + */ +#define PyObject_VAR_HEAD PyVarObject ob_base; +#define Py_INVALID_SIZE (Py_ssize_t)-1 + +/* Nothing is actually declared to be a PyObject, but every pointer to + * a Python object can be cast to a PyObject*. This is inheritance built + * by hand. Similarly every pointer to a variable-size Python object can, + * in addition, be cast to PyVarObject*. + */ +typedef struct _object { + _PyObject_HEAD_EXTRA + Py_ssize_t ob_refcnt; + struct _typeobject *ob_type; +} PyObject; + +typedef struct { + PyObject ob_base; + Py_ssize_t ob_size; /* Number of items in variable part */ +} PyVarObject; + +#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + +#ifndef Py_LIMITED_API +/********************* String Literals ****************************************/ +/* This structure helps managing static strings. The basic usage goes like this: + Instead of doing + + r = PyObject_CallMethod(o, "foo", "args", ...); + + do + + _Py_IDENTIFIER(foo); + ... + r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...); + + PyId_foo is a static variable, either on block level or file level. On first + usage, the string "foo" is interned, and the structures are linked. On interpreter + shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + + Alternatively, _Py_static_string allows choosing the variable name. + _PyUnicode_FromId returns a borrowed reference to the interned string. + _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*. +*/ +typedef struct _Py_Identifier { + struct _Py_Identifier *next; + const char* string; + PyObject *object; +} _Py_Identifier; + +#define _Py_static_string_init(value) { .next = NULL, .string = value, .object = NULL } +#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) +#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) + +#endif /* !Py_LIMITED_API */ + +/* +Type objects contain a string containing the type name (to help somewhat +in debugging), the allocation parameters (see PyObject_New() and +PyObject_NewVar()), +and methods for accessing objects of the type. Methods are optional, a +nil pointer meaning that particular kind of access is not available for +this type. The Py_DECREF() macro uses the tp_dealloc method without +checking for a nil pointer; it should always be implemented except if +the implementation can guarantee that the reference count will never +reach zero (e.g., for statically allocated type objects). + +NB: the methods for certain type groups are now contained in separate +method blocks. +*/ + +typedef PyObject * (*unaryfunc)(PyObject *); +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); +typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); +typedef int (*inquiry)(PyObject *); +typedef Py_ssize_t (*lenfunc)(PyObject *); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* buffer interface */ +typedef struct bufferinfo { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; +} Py_buffer; + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(PyObject *, Py_buffer *); + +/* Maximum number of dimensions */ +#define PyBUF_MAX_NDIM 64 + +/* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 + +/* End buffer interface */ +#endif /* Py_LIMITED_API */ + +typedef int (*objobjproc)(PyObject *, PyObject *); +typedef int (*visitproc)(PyObject *, void *); +typedef int (*traverseproc)(PyObject *, visitproc, void *); + +#ifndef Py_LIMITED_API +typedef struct { + /* Number implementations must check *both* + arguments for proper type and implement the necessary conversions + in the slot functions themselves. */ + + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_bool; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + unaryfunc nb_int; + void *nb_reserved; /* the slot formerly known as nb_long */ + unaryfunc nb_float; + + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + unaryfunc nb_index; + + binaryfunc nb_matrix_multiply; + binaryfunc nb_inplace_matrix_multiply; +} PyNumberMethods; + +typedef struct { + lenfunc sq_length; + binaryfunc sq_concat; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + void *was_sq_slice; + ssizeobjargproc sq_ass_item; + void *was_sq_ass_slice; + objobjproc sq_contains; + + binaryfunc sq_inplace_concat; + ssizeargfunc sq_inplace_repeat; +} PySequenceMethods; + +typedef struct { + lenfunc mp_length; + binaryfunc mp_subscript; + objobjargproc mp_ass_subscript; +} PyMappingMethods; + +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} PyAsyncMethods; + +typedef struct { + getbufferproc bf_getbuffer; + releasebufferproc bf_releasebuffer; +} PyBufferProcs; +#endif /* Py_LIMITED_API */ + +typedef void (*freefunc)(void *); +typedef void (*destructor)(PyObject *); +#ifndef Py_LIMITED_API +/* We can't provide a full compile-time check that limited-API + users won't implement tp_print. However, not defining printfunc + and making tp_print of a different function pointer type + should at least cause a warning in most cases. */ +typedef int (*printfunc)(PyObject *, FILE *, int); +#endif +typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); +typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*reprfunc)(PyObject *); +typedef Py_hash_t (*hashfunc)(PyObject *); +typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); +typedef PyObject *(*getiterfunc) (PyObject *); +typedef PyObject *(*iternextfunc) (PyObject *); +typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*initproc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); + +#ifdef Py_LIMITED_API +typedef struct _typeobject PyTypeObject; /* opaque */ +#else +typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) + or tp_reserved (Python 3) */ + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + unsigned long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + Py_ssize_t tp_weaklistoffset; + + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + Py_ssize_t tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + + destructor tp_finalize; + +#ifdef COUNT_ALLOCS + /* these must be last and never explicitly initialized */ + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; + struct _typeobject *tp_next; +#endif +} PyTypeObject; +#endif + +typedef struct{ + int slot; /* slot id, see below */ + void *pfunc; /* function pointer */ +} PyType_Slot; + +typedef struct{ + const char* name; + int basicsize; + int itemsize; + unsigned int flags; + PyType_Slot *slots; /* terminated by slot==0. */ +} PyType_Spec; + +PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); +#endif + +#ifndef Py_LIMITED_API +/* The *real* layout of a type object when allocated on the heap */ +typedef struct _heaptypeobject { + /* Note: there's a dependency on the order of these members + in slotptr() in typeobject.c . */ + PyTypeObject ht_type; + PyAsyncMethods as_async; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; /* as_sequence comes after as_mapping, + so that the mapping wins when both + the mapping and the sequence define + a given operator (e.g. __getitem__). + see add_operators() in typeobject.c . */ + PyBufferProcs as_buffer; + PyObject *ht_name, *ht_slots, *ht_qualname; + struct _dictkeysobject *ht_cached_keys; + /* here are optional user slots, followed by the members. */ +} PyHeapTypeObject; + +/* access macro to the members which are floating "behind" the object */ +#define PyHeapType_GET_MEMBERS(etype) \ + ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize)) +#endif + +/* Generic type check */ +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); +#define PyObject_TypeCheck(ob, tp) \ + (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ + +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); + +#define PyType_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) +#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) + +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, + PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); +PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); +PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); +#endif +PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); +PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); +#endif + +/* Generic operations on objects */ +#ifndef Py_LIMITED_API +struct _Py_Identifier; +PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); +PyAPI_FUNC(void) _Py_BreakPoint(void); +PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_ASCII(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Bytes(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); +PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); +PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); +PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); +#endif +PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *); +PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *); +PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); +PyAPI_FUNC(int) PyObject_Not(PyObject *); +PyAPI_FUNC(int) PyCallable_Check(PyObject *); + +PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); +PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *); +#endif + +#ifndef Py_LIMITED_API +/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes + dict as the last parameter. */ +PyAPI_FUNC(PyObject *) +_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) +_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +/* Helper to look up a builtin object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) +_PyObject_GetBuiltin(const char *name); +#endif + +/* PyObject_Dir(obj) acts like Python builtins.dir(obj), returning a + list of strings. PyObject_Dir(NULL) is like builtins.dir(), + returning the names of the current locals. In this case, if there are + no current locals, NULL is returned, and PyErr_Occurred() is false. +*/ +PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); + + +/* Helpers for printing recursive container types */ +PyAPI_FUNC(int) Py_ReprEnter(PyObject *); +PyAPI_FUNC(void) Py_ReprLeave(PyObject *); + +/* Flag bits for printing: */ +#define Py_PRINT_RAW 1 /* No string quotes etc. */ + +/* +`Type flags (tp_flags) + +These flags are used to extend the type structure in a backwards-compatible +fashion. Extensions can use the flags to indicate (and test) when a given +type structure contains a new feature. The Python core will use these when +introducing new functionality between major revisions (to avoid mid-version +changes in the PYTHON_API_VERSION). + +Arbitration of the flag bit positions will need to be coordinated among +all extension writers who publically release their extensions (this will +be fewer than you might expect!).. + +Most flags were removed as of Python 3.0 to make room for new flags. (Some +flags are not for backwards compatibility but to indicate the presence of an +optional feature; these flags remain of course.) + +Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. + +Code can use PyType_HasFeature(type_ob, flag_value) to test whether the +given type object has a specified feature. +*/ + +/* Set if the type object is dynamically allocated */ +#define Py_TPFLAGS_HEAPTYPE (1UL << 9) + +/* Set if the type allows subclassing */ +#define Py_TPFLAGS_BASETYPE (1UL << 10) + +/* Set if the type is 'ready' -- fully initialized */ +#define Py_TPFLAGS_READY (1UL << 12) + +/* Set while the type is being 'readied', to prevent recursive ready calls */ +#define Py_TPFLAGS_READYING (1UL << 13) + +/* Objects support garbage collection (see objimp.h) */ +#define Py_TPFLAGS_HAVE_GC (1UL << 14) + +/* These two bits are preserved for Stackless Python, next after this is 17 */ +#ifdef STACKLESS +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15) +#else +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 +#endif + +/* Objects support type attribute cache */ +#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) +#define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) + +/* Type is abstract and cannot be instantiated */ +#define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) + +/* These flags are used to determine if a type is a subclass. */ +#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) +#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) +#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26) +#define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27) +#define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28) +#define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29) +#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30) +#define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31) + +#define Py_TPFLAGS_DEFAULT ( \ + Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_VERSION_TAG | \ + 0) + +/* NOTE: The following flags reuse lower bits (removed as part of the + * Python 3.0 transition). */ + +/* Type structure has tp_finalize member (3.4) */ +#define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) + +#ifdef Py_LIMITED_API +#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) +#else +#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#endif +#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) + + +/* +The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement +reference counts. Py_DECREF calls the object's deallocator function when +the refcount falls to 0; for +objects that don't contain references to other objects or heap memory +this can be the standard function free(). Both macros can be used +wherever a void expression is allowed. The argument must not be a +NULL pointer. If it may be NULL, use Py_XINCREF/Py_XDECREF instead. +The macro _Py_NewReference(op) initialize reference counts to 1, and +in special builds (Py_REF_DEBUG, Py_TRACE_REFS) performs additional +bookkeeping appropriate to the special build. + +We assume that the reference count field can never overflow; this can +be proven when the size of the field is the same as the pointer size, so +we ignore the possibility. Provided a C int is at least 32 bits (which +is implicitly assumed in many parts of this code), that's enough for +about 2**31 references to an object. + +XXX The following became out of date in Python 2.2, but I'm not sure +XXX what the full truth is now. Certainly, heap-allocated type objects +XXX can and should be deallocated. +Type objects should never be deallocated; the type pointer in an object +is not considered to be a reference to the type object, to save +complications in the deallocation function. (This is actually a +decision that's up to the implementer of each new type so if you want, +you can count such references to the type object.) +*/ + +/* First define a pile of simple helper macros, one set per special + * build symbol. These either expand to the obvious things, or to + * nothing at all when the special mode isn't in effect. The main + * macros can later be defined just once then, yet expand to different + * things depending on which special build options are and aren't in effect. + * Trust me : while painful, this is 20x easier to understand than, + * e.g, defining _Py_NewReference five different times in a maze of nested + * #ifdefs (we used to do that -- it was impenetrable). + */ +#ifdef Py_REF_DEBUG +PyAPI_DATA(Py_ssize_t) _Py_RefTotal; +PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname, + int lineno, PyObject *op); +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#define _Py_INC_REFTOTAL _Py_RefTotal++ +#define _Py_DEC_REFTOTAL _Py_RefTotal-- +#define _Py_REF_DEBUG_COMMA , +#define _Py_CHECK_REFCNT(OP) \ +{ if (((PyObject*)OP)->ob_refcnt < 0) \ + _Py_NegativeRefcount(__FILE__, __LINE__, \ + (PyObject *)(OP)); \ +} +/* Py_REF_DEBUG also controls the display of refcounts and memory block + * allocations at the interactive prompt and at interpreter shutdown + */ +PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); +#define _PY_DEBUG_PRINT_TOTAL_REFS() _PyDebug_PrintTotalRefs() +#else +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; +#define _PY_DEBUG_PRINT_TOTAL_REFS() +#endif /* Py_REF_DEBUG */ + +#ifdef COUNT_ALLOCS +PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); +#define _Py_INC_TPALLOCS(OP) inc_count(Py_TYPE(OP)) +#define _Py_INC_TPFREES(OP) dec_count(Py_TYPE(OP)) +#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- +#define _Py_COUNT_ALLOCS_COMMA , +#else +#define _Py_INC_TPALLOCS(OP) +#define _Py_INC_TPFREES(OP) +#define _Py_DEC_TPFREES(OP) +#define _Py_COUNT_ALLOCS_COMMA +#endif /* COUNT_ALLOCS */ + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_NewReference(PyObject *); +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +PyAPI_FUNC(void) _Py_PrintReferences(FILE *); +PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); +PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); + +#else +/* Without Py_TRACE_REFS, there's little enough to do that we expand code + * inline. + */ +#define _Py_NewReference(op) ( \ + _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + Py_REFCNT(op) = 1) + +#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) + +#ifdef Py_LIMITED_API +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +#else +#define _Py_Dealloc(op) ( \ + _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \ + (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) +#endif +#endif /* !Py_TRACE_REFS */ + +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject *)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + do { \ + PyObject *_py_decref_tmp = (PyObject *)(op); \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --(_py_decref_tmp)->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(_py_decref_tmp) \ + else \ + _Py_Dealloc(_py_decref_tmp); \ + } while (0) + +/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear + * and tp_dealloc implementations. + * + * Note that "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = NULL; + * + * Typically, `op` is something like self->containee, and `self` is done + * using its `containee` member. In the code sequence above, suppose + * `containee` is non-NULL with a refcount of 1. Its refcount falls to + * 0 on the first line, which can trigger an arbitrary amount of code, + * possibly including finalizers (like __del__ methods or weakref callbacks) + * coded in Python, which in turn can release the GIL and allow other threads + * to run, etc. Such code may even invoke methods of `self` again, or cause + * cyclic gc to trigger, but-- oops! --self->containee still points to the + * object being torn down, and it may be in an insane state while being torn + * down. This has in fact been a rich historic source of miserable (rare & + * hard-to-diagnose) segfaulting (and other) bugs. + * + * The safe way is: + * + * Py_CLEAR(op); + * + * That arranges to set `op` to NULL _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * There are cases where it's safe to use the naive code, but they're brittle. + * For example, if `op` points to a Python integer, you know that destroying + * one of those can't cause problems -- but in part that relies on that + * Python integers aren't currently weakly referencable. Best practice is + * to use Py_CLEAR() even if you can't think of a reason for why you need to. + */ +#define Py_CLEAR(op) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + if (_py_tmp != NULL) { \ + (op) = NULL; \ + Py_DECREF(_py_tmp); \ + } \ + } while (0) + +/* Macros to use in case the object pointer may be NULL: */ +#define Py_XINCREF(op) \ + do { \ + PyObject *_py_xincref_tmp = (PyObject *)(op); \ + if (_py_xincref_tmp != NULL) \ + Py_INCREF(_py_xincref_tmp); \ + } while (0) + +#define Py_XDECREF(op) \ + do { \ + PyObject *_py_xdecref_tmp = (PyObject *)(op); \ + if (_py_xdecref_tmp != NULL) \ + Py_DECREF(_py_xdecref_tmp); \ + } while (0) + +#ifndef Py_LIMITED_API +/* Safely decref `op` and set `op` to `op2`. + * + * As in case of Py_CLEAR "the obvious" code can be deadly: + * + * Py_DECREF(op); + * op = op2; + * + * The safe way is: + * + * Py_SETREF(op, op2); + * + * That arranges to set `op` to `op2` _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of + * Py_DECREF. + */ + +#define Py_SETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_DECREF(_py_tmp); \ + } while (0) + +#define Py_XSETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_XDECREF(_py_tmp); \ + } while (0) + +#endif /* ifndef Py_LIMITED_API */ + +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNone_Type; +PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; +#endif /* !Py_LIMITED_API */ + +/* +_Py_NoneStruct is an object of undefined type which can be used in contexts +where NULL (nil) is not suitable (since NULL often means 'error'). + +Don't forget to apply Py_INCREF() when returning this value!!! +*/ +PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ +#define Py_None (&_Py_NoneStruct) + +/* Macro for returning Py_None from a function */ +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None + +/* +Py_NotImplemented is a singleton used to signal that an operation is +not implemented for a given type combination. +*/ +PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ +#define Py_NotImplemented (&_Py_NotImplementedStruct) + +/* Macro for returning Py_NotImplemented from a function */ +#define Py_RETURN_NOTIMPLEMENTED \ + return Py_INCREF(Py_NotImplemented), Py_NotImplemented + +/* Rich comparison opcodes */ +#define Py_LT 0 +#define Py_LE 1 +#define Py_EQ 2 +#define Py_NE 3 +#define Py_GT 4 +#define Py_GE 5 + +#ifndef Py_LIMITED_API +/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. + * Defined in object.c. + */ +PyAPI_DATA(int) _Py_SwappedOp[]; +#endif /* !Py_LIMITED_API */ + + +/* +More conventions +================ + +Argument Checking +----------------- + +Functions that take objects as arguments normally don't check for nil +arguments, but they do check the type of the argument, and return an +error if the function doesn't apply to the type. + +Failure Modes +------------- + +Functions may fail for a variety of reasons, including running out of +memory. This is communicated to the caller in two ways: an error string +is set (see errors.h), and the function result differs: functions that +normally return a pointer return NULL for failure, functions returning +an integer return -1 (which could be a legal return value too!), and +other functions return 0 for success and -1 for failure. +Callers should always check for errors before using the result. If +an error was set, the caller must either explicitly clear it, or pass +the error on to its caller. + +Reference Counts +---------------- + +It takes a while to get used to the proper usage of reference counts. + +Functions that create an object set the reference count to 1; such new +objects must be stored somewhere or destroyed again with Py_DECREF(). +Some functions that 'store' objects, such as PyTuple_SetItem() and +PyList_SetItem(), +don't increment the reference count of the object, since the most +frequent use is to store a fresh object. Functions that 'retrieve' +objects, such as PyTuple_GetItem() and PyDict_GetItemString(), also +don't increment +the reference count, since most frequently the object is only looked at +quickly. Thus, to retrieve an object and store it again, the caller +must call Py_INCREF() explicitly. + +NOTE: functions that 'consume' a reference count, like +PyList_SetItem(), consume the reference even if the object wasn't +successfully stored, to simplify error handling. + +It seems attractive to make other functions that take an object as +argument consume a reference count; however, this may quickly get +confusing (even the current practice is already confusing). Consider +it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at +times. +*/ + + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack faults, and +especially in threads (which typically have less stack space to work with). + +A container object that participates in cyclic gc can avoid this by +bracketing the body of its tp_dealloc function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_SAFE_BEGIN(p) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_SAFE_END(p) +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into N / PyTrash_UNWIND_LEVEL pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. +*/ + +#ifndef Py_LIMITED_API +/* This is the old private API, invoked by the macros before 3.2.4. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); +PyAPI_DATA(int) _PyTrash_delete_nesting; +PyAPI_DATA(PyObject *) _PyTrash_delete_later; +#endif /* !Py_LIMITED_API */ + +/* The new thread-safe private API, invoked by the macros below. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_SAFE_BEGIN(op) \ + do { \ + PyThreadState *_tstate = PyThreadState_GET(); \ + if (_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ + ++_tstate->trash_delete_nesting; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_SAFE_END(op) \ + --_tstate->trash_delete_nesting; \ + if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ + _PyTrash_thread_destroy_chain(); \ + } \ + else \ + _PyTrash_thread_deposit_object((PyObject*)op); \ + } while (0); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) +_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, + size_t sizeof_block); +PyAPI_FUNC(void) +_PyObject_DebugTypeStats(FILE *out); +#endif /* ifndef Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/objimpl.h b/flaskwebproject/FlaskWebProject1/Include/objimpl.h new file mode 100644 index 0000000..e7a3696 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/objimpl.h @@ -0,0 +1,370 @@ +/* The PyObject_ memory family: high-level object memory interfaces. + See pymem.h for the low-level PyMem_ family. +*/ + +#ifndef Py_OBJIMPL_H +#define Py_OBJIMPL_H + +#include "pymem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyObject_ memory functions with calls to the platform + malloc/realloc/ calloc/free, or with calls to PyMem_. +*/ + +/* +Functions and macros for modules that implement new object types. + + - PyObject_New(type, typeobj) allocates memory for a new object of the given + type, and initializes part of it. 'type' must be the C structure type used + to represent the object, and 'typeobj' the address of the corresponding + type object. Reference count and type pointer are filled in; the rest of + the bytes of the object are *undefined*! The resulting expression type is + 'type *'. The size of the object is determined by the tp_basicsize field + of the type object. + + - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size + object with room for n items. In addition to the refcount and type pointer + fields, this also fills in the ob_size field. + + - PyObject_Del(op) releases the memory allocated for an object. It does not + run a destructor -- it only frees the memory. PyObject_Free is identical. + + - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't + allocate memory. Instead of a 'type' parameter, they take a pointer to a + new object (allocated by an arbitrary allocator), and initialize its object + header fields. + +Note that objects created with PyObject_{New, NewVar} are allocated using the +specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is +enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG +is also #defined. + +In case a specific form of memory management is needed (for example, if you +must use the platform malloc heap(s), or shared memory, or C++ local storage or +operator new), you must first allocate the object with your custom allocator, +then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- +specific fields: reference count, type pointer, possibly others. You should +be aware that Python has no control over these objects because they don't +cooperate with the Python memory manager. Such objects may not be eligible +for automatic garbage collection and you have to make sure that they are +released accordingly whenever their destructor gets called (cf. the specific +form of memory management you're using). + +Unless you have specific memory management requirements, use +PyObject_{New, NewVar, Del}. +*/ + +/* + * Raw object memory interface + * =========================== + */ + +/* Functions to call the same malloc/realloc/free as used by Python's + object allocator. If WITH_PYMALLOC is enabled, these may differ from + the platform malloc/realloc/free. The Python object allocator is + designed for fast, cache-conscious allocation of many "small" objects, + and with low hidden memory overhead. + + PyObject_Malloc(0) returns a unique non-NULL pointer if possible. + + PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). + PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory + at p. + + Returned pointers must be checked for NULL explicitly; no action is + performed on failure other than to return NULL (no warning it printed, no + exception is set, etc). + + For allocating objects, use PyObject_{New, NewVar} instead whenever + possible. The PyObject_{Malloc, Realloc, Free} family is exposed + so that you can exploit Python's small-block allocator for non-object + uses. If you must use these routines to allocate object memory, make sure + the object gets initialized via PyObject_{Init, InitVar} after obtaining + the raw memory. +*/ +PyAPI_FUNC(void *) PyObject_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyObject_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyObject_Free(void *ptr); + +#ifndef Py_LIMITED_API +/* This function returns the number of allocated memory blocks, regardless of size */ +PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); +#endif /* !Py_LIMITED_API */ + +/* Macros */ +#ifdef WITH_PYMALLOC +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyObject_DebugMallocStats(FILE *out); +#endif /* #ifndef Py_LIMITED_API */ +#endif + +/* Macros */ +#define PyObject_MALLOC PyObject_Malloc +#define PyObject_REALLOC PyObject_Realloc +#define PyObject_FREE PyObject_Free +#define PyObject_Del PyObject_Free +#define PyObject_DEL PyObject_Free + + +/* + * Generic object allocator interface + * ================================== + */ + +/* Functions */ +PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); +PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, + PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); + +#define PyObject_New(type, typeobj) \ + ( (type *) _PyObject_New(typeobj) ) +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) + +/* Macros trading binary compatibility for speed. See also pymem.h. + Note that these macros expect non-NULL object pointers.*/ +#define PyObject_INIT(op, typeobj) \ + ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) +#define PyObject_INIT_VAR(op, typeobj, size) \ + ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) + +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or int, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) + +#define PyObject_NEW(type, typeobj) \ +( (type *) PyObject_Init( \ + (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) + +#define PyObject_NEW_VAR(type, typeobj, n) \ +( (type *) PyObject_InitVar( \ + (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ + (typeobj), (n)) ) + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar +*/ + +#ifndef Py_LIMITED_API +typedef struct { + /* user context passed as the first argument to the 2 functions */ + void *ctx; + + /* allocate an arena of size bytes */ + void* (*alloc) (void *ctx, size_t size); + + /* free an arena */ + void (*free) (void *ctx, void *ptr, size_t size); +} PyObjectArenaAllocator; + +/* Get the arena allocator. */ +PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); + +/* Set the arena allocator. */ +PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); +#endif + + +/* + * Garbage Collection Support + * ========================== + */ + +/* C equivalent of gc.collect() which ignores the state of gc.enabled. */ +PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); +#endif + +/* Test if a type has a GC head */ +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + +/* Test if an object has a GC head */ +#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ + (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) + +PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); +#define PyObject_GC_Resize(type, op, n) \ + ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) + +/* GC information is stored BEFORE the object structure. */ +#ifndef Py_LIMITED_API +typedef union _gc_head { + struct { + union _gc_head *gc_next; + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; + double dummy; /* force worst-case alignment */ +} PyGC_Head; + +extern PyGC_Head *_PyGC_generation0; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +/* Bit 0 is set when tp_finalize is called */ +#define _PyGC_REFS_MASK_FINALIZED (1 << 0) +/* The (N-1) most significant bits contain the gc state / refcount */ +#define _PyGC_REFS_SHIFT (1) +#define _PyGC_REFS_MASK (((size_t) -1) << _PyGC_REFS_SHIFT) + +#define _PyGCHead_REFS(g) ((g)->gc.gc_refs >> _PyGC_REFS_SHIFT) +#define _PyGCHead_SET_REFS(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK) \ + | (((size_t)(v)) << _PyGC_REFS_SHIFT); \ + } while (0) +#define _PyGCHead_DECREF(g) ((g)->gc.gc_refs -= 1 << _PyGC_REFS_SHIFT) + +#define _PyGCHead_FINALIZED(g) (((g)->gc.gc_refs & _PyGC_REFS_MASK_FINALIZED) != 0) +#define _PyGCHead_SET_FINALIZED(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK_FINALIZED) \ + | (v != 0); \ + } while (0) + +#define _PyGC_FINALIZED(o) _PyGCHead_FINALIZED(_Py_AS_GC(o)) +#define _PyGC_SET_FINALIZED(o, v) _PyGCHead_SET_FINALIZED(_Py_AS_GC(o), v) + +#define _PyGC_REFS(o) _PyGCHead_REFS(_Py_AS_GC(o)) + +#define _PyGC_REFS_UNTRACKED (-2) +#define _PyGC_REFS_REACHABLE (-3) +#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) + +/* Tell the GC to track this object. NB: While the object is tracked the + * collector it must be safe to call the ob_traverse method. */ +#define _PyObject_GC_TRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + if (_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED) \ + Py_FatalError("GC object already tracked"); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_REACHABLE); \ + g->gc.gc_next = _PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0->gc.gc_prev = g; \ + } while (0); + +/* Tell the GC to stop tracking this object. + * gc_next doesn't need to be set to NULL, but doing so is a good + * way to provoke memory errors if calling code is confused. + */ +#define _PyObject_GC_UNTRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + assert(_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_UNTRACKED); \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ + } while (0); + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + (_PyGC_REFS(o) != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) +#endif /* Py_LIMITED_API */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); +PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(void) PyObject_GC_Track(void *); +PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); +PyAPI_FUNC(void) PyObject_GC_Del(void *); + +#define PyObject_GC_New(type, typeobj) \ + ( (type *) _PyObject_GC_New(typeobj) ) +#define PyObject_GC_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) + + +/* Utility macro to help write tp_traverse functions. + * To use this macro, the tp_traverse function must name its arguments + * "visit" and "arg". This is intended to keep tp_traverse functions + * looking as much alike as possible. + */ +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((PyObject *)(op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) + + +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJIMPL_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/odictobject.h b/flaskwebproject/FlaskWebProject1/Include/odictobject.h new file mode 100644 index 0000000..692194d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/odictobject.h @@ -0,0 +1,43 @@ +#ifndef Py_ODICTOBJECT_H +#define Py_ODICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* OrderedDict */ +/* This API is optional and mostly redundant. */ + +#ifndef Py_LIMITED_API + +typedef struct _odictobject PyODictObject; + +PyAPI_DATA(PyTypeObject) PyODict_Type; +PyAPI_DATA(PyTypeObject) PyODictIter_Type; +PyAPI_DATA(PyTypeObject) PyODictKeys_Type; +PyAPI_DATA(PyTypeObject) PyODictItems_Type; +PyAPI_DATA(PyTypeObject) PyODictValues_Type; + +#define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) +#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_SIZE(op) ((PyDictObject *)op)->ma_used + +PyAPI_FUNC(PyObject *) PyODict_New(void); +PyAPI_FUNC(int) PyODict_SetItem(PyObject *od, PyObject *key, PyObject *item); +PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key); + +/* wrappers around PyDict* functions */ +#define PyODict_GetItem(od, key) PyDict_GetItem((PyObject *)od, key) +#define PyODict_GetItemWithError(od, key) \ + PyDict_GetItemWithError((PyObject *)od, key) +#define PyODict_Contains(od, key) PyDict_Contains((PyObject *)od, key) +#define PyODict_Size(od) PyDict_Size((PyObject *)od) +#define PyODict_GetItemString(od, key) \ + PyDict_GetItemString((PyObject *)od, key) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ODICTOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/opcode.h b/flaskwebproject/FlaskWebProject1/Include/opcode.h new file mode 100644 index 0000000..be360e1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/opcode.h @@ -0,0 +1,146 @@ +/* Auto-generated by Tools/scripts/generate_opcode_h.py */ +#ifndef Py_OPCODE_H +#define Py_OPCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + + /* Instruction opcodes for compiled code */ +#define POP_TOP 1 +#define ROT_TWO 2 +#define ROT_THREE 3 +#define DUP_TOP 4 +#define DUP_TOP_TWO 5 +#define NOP 9 +#define UNARY_POSITIVE 10 +#define UNARY_NEGATIVE 11 +#define UNARY_NOT 12 +#define UNARY_INVERT 15 +#define BINARY_MATRIX_MULTIPLY 16 +#define INPLACE_MATRIX_MULTIPLY 17 +#define BINARY_POWER 19 +#define BINARY_MULTIPLY 20 +#define BINARY_MODULO 22 +#define BINARY_ADD 23 +#define BINARY_SUBTRACT 24 +#define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 +#define GET_AITER 50 +#define GET_ANEXT 51 +#define BEFORE_ASYNC_WITH 52 +#define INPLACE_ADD 55 +#define INPLACE_SUBTRACT 56 +#define INPLACE_MULTIPLY 57 +#define INPLACE_MODULO 59 +#define STORE_SUBSCR 60 +#define DELETE_SUBSCR 61 +#define BINARY_LSHIFT 62 +#define BINARY_RSHIFT 63 +#define BINARY_AND 64 +#define BINARY_XOR 65 +#define BINARY_OR 66 +#define INPLACE_POWER 67 +#define GET_ITER 68 +#define GET_YIELD_FROM_ITER 69 +#define PRINT_EXPR 70 +#define LOAD_BUILD_CLASS 71 +#define YIELD_FROM 72 +#define GET_AWAITABLE 73 +#define INPLACE_LSHIFT 75 +#define INPLACE_RSHIFT 76 +#define INPLACE_AND 77 +#define INPLACE_XOR 78 +#define INPLACE_OR 79 +#define BREAK_LOOP 80 +#define WITH_CLEANUP_START 81 +#define WITH_CLEANUP_FINISH 82 +#define RETURN_VALUE 83 +#define IMPORT_STAR 84 +#define SETUP_ANNOTATIONS 85 +#define YIELD_VALUE 86 +#define POP_BLOCK 87 +#define END_FINALLY 88 +#define POP_EXCEPT 89 +#define HAVE_ARGUMENT 90 +#define STORE_NAME 90 +#define DELETE_NAME 91 +#define UNPACK_SEQUENCE 92 +#define FOR_ITER 93 +#define UNPACK_EX 94 +#define STORE_ATTR 95 +#define DELETE_ATTR 96 +#define STORE_GLOBAL 97 +#define DELETE_GLOBAL 98 +#define LOAD_CONST 100 +#define LOAD_NAME 101 +#define BUILD_TUPLE 102 +#define BUILD_LIST 103 +#define BUILD_SET 104 +#define BUILD_MAP 105 +#define LOAD_ATTR 106 +#define COMPARE_OP 107 +#define IMPORT_NAME 108 +#define IMPORT_FROM 109 +#define JUMP_FORWARD 110 +#define JUMP_IF_FALSE_OR_POP 111 +#define JUMP_IF_TRUE_OR_POP 112 +#define JUMP_ABSOLUTE 113 +#define POP_JUMP_IF_FALSE 114 +#define POP_JUMP_IF_TRUE 115 +#define LOAD_GLOBAL 116 +#define CONTINUE_LOOP 119 +#define SETUP_LOOP 120 +#define SETUP_EXCEPT 121 +#define SETUP_FINALLY 122 +#define LOAD_FAST 124 +#define STORE_FAST 125 +#define DELETE_FAST 126 +#define STORE_ANNOTATION 127 +#define RAISE_VARARGS 130 +#define CALL_FUNCTION 131 +#define MAKE_FUNCTION 132 +#define BUILD_SLICE 133 +#define LOAD_CLOSURE 135 +#define LOAD_DEREF 136 +#define STORE_DEREF 137 +#define DELETE_DEREF 138 +#define CALL_FUNCTION_KW 141 +#define CALL_FUNCTION_EX 142 +#define SETUP_WITH 143 +#define EXTENDED_ARG 144 +#define LIST_APPEND 145 +#define SET_ADD 146 +#define MAP_ADD 147 +#define LOAD_CLASSDEREF 148 +#define BUILD_LIST_UNPACK 149 +#define BUILD_MAP_UNPACK 150 +#define BUILD_MAP_UNPACK_WITH_CALL 151 +#define BUILD_TUPLE_UNPACK 152 +#define BUILD_SET_UNPACK 153 +#define SETUP_ASYNC_WITH 154 +#define FORMAT_VALUE 155 +#define BUILD_CONST_KEY_MAP 156 +#define BUILD_STRING 157 +#define BUILD_TUPLE_UNPACK_WITH_CALL 158 + +/* EXCEPT_HANDLER is a special, implicit block type which is created when + entering an except handler. It is not an opcode but we define it here + as we want it to be available to both frameobject.c and ceval.c, while + remaining private.*/ +#define EXCEPT_HANDLER 257 + + +enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, + PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, + PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; + +#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/osdefs.h b/flaskwebproject/FlaskWebProject1/Include/osdefs.h new file mode 100644 index 0000000..bd84c1c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/osdefs.h @@ -0,0 +1,47 @@ +#ifndef Py_OSDEFS_H +#define Py_OSDEFS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Operating system dependencies */ + +#ifdef MS_WINDOWS +#define SEP L'\\' +#define ALTSEP L'/' +#define MAXPATHLEN 256 +#define DELIM L';' +#endif + +/* Filename separator */ +#ifndef SEP +#define SEP L'/' +#endif + +/* Max pathname length */ +#ifdef __hpux +#include +#include +#ifndef PATH_MAX +#define PATH_MAX MAXPATHLEN +#endif +#endif + +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +/* Search path entry delimiter */ +#ifndef DELIM +#define DELIM L':' +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSDEFS_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/osmodule.h b/flaskwebproject/FlaskWebProject1/Include/osmodule.h new file mode 100644 index 0000000..9095c2f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/osmodule.h @@ -0,0 +1,17 @@ + +/* os module interface */ + +#ifndef Py_OSMODULE_H +#define Py_OSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyOS_FSPath(PyObject *path); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSMODULE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/parsetok.h b/flaskwebproject/FlaskWebProject1/Include/parsetok.h new file mode 100644 index 0000000..2acb854 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/parsetok.h @@ -0,0 +1,108 @@ + +/* Parser-tokenizer link interface */ +#ifndef Py_LIMITED_API +#ifndef Py_PARSETOK_H +#define Py_PARSETOK_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int error; +#ifndef PGEN + /* The filename is useless for pgen, see comment in tok_state structure */ + PyObject *filename; +#endif + int lineno; + int offset; + char *text; /* UTF-8-encoded string */ + int token; + int expected; +} perrdetail; + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 +#endif + +#define PyPARSE_IGNORE_COOKIE 0x0010 +#define PyPARSE_BARRY_AS_BDFL 0x0020 + +PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, + perrdetail *); +PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, + const char *, const char *, + perrdetail *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseFileObject( + FILE *fp, + PyObject *filename, + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); + +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseStringObject( + const char *s, + PyObject *filename, + grammar *g, + int start, + perrdetail *err_ret, + int *flags); + +/* Note that the following functions are defined in pythonrun.c, + not in parsetok.c */ +PyAPI_FUNC(void) PyParser_SetError(perrdetail *); +PyAPI_FUNC(void) PyParser_ClearError(perrdetail *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PARSETOK_H */ +#endif /* !Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/patchlevel.h b/flaskwebproject/FlaskWebProject1/Include/patchlevel.h new file mode 100644 index 0000000..f20d080 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/patchlevel.h @@ -0,0 +1,35 @@ + +/* Python version identification scheme. + + When the major or minor version changes, the VERSION variable in + configure.ac must also be changed. + + There is also (independent) API version information in modsupport.h. +*/ + +/* Values for PY_RELEASE_LEVEL */ +#define PY_RELEASE_LEVEL_ALPHA 0xA +#define PY_RELEASE_LEVEL_BETA 0xB +#define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ +#define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ + /* Higher for patch releases */ + +/* Version parsed out into numeric values */ +/*--start constants--*/ +#define PY_MAJOR_VERSION 3 +#define PY_MINOR_VERSION 6 +#define PY_MICRO_VERSION 6 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 + +/* Version as a string */ +#define PY_VERSION "3.6.6" +/*--end constants--*/ + +/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. + Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ +#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ + (PY_MINOR_VERSION << 16) | \ + (PY_MICRO_VERSION << 8) | \ + (PY_RELEASE_LEVEL << 4) | \ + (PY_RELEASE_SERIAL << 0)) diff --git a/flaskwebproject/FlaskWebProject1/Include/pgen.h b/flaskwebproject/FlaskWebProject1/Include/pgen.h new file mode 100644 index 0000000..8a325ed --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pgen.h @@ -0,0 +1,18 @@ +#ifndef Py_PGEN_H +#define Py_PGEN_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Parser generator interface */ + +extern grammar *meta_grammar(void); + +struct _node; +extern grammar *pgen(struct _node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGEN_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pgenheaders.h b/flaskwebproject/FlaskWebProject1/Include/pgenheaders.h new file mode 100644 index 0000000..4843de6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pgenheaders.h @@ -0,0 +1,43 @@ +#ifndef Py_PGENHEADERS_H +#define Py_PGENHEADERS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Include files and extern declarations used by most of the parser. */ + +#include "Python.h" + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +#define addarc _Py_addarc +#define addbit _Py_addbit +#define adddfa _Py_adddfa +#define addfirstsets _Py_addfirstsets +#define addlabel _Py_addlabel +#define addstate _Py_addstate +#define delbitset _Py_delbitset +#define dumptree _Py_dumptree +#define findlabel _Py_findlabel +#define freegrammar _Py_freegrammar +#define mergebitset _Py_mergebitset +#define meta_grammar _Py_meta_grammar +#define newbitset _Py_newbitset +#define newgrammar _Py_newgrammar +#define pgen _Py_pgen +#define printgrammar _Py_printgrammar +#define printnonterminals _Py_printnonterminals +#define printtree _Py_printtree +#define samebitset _Py_samebitset +#define showtree _Py_showtree +#define tok_dump _Py_tok_dump +#define translatelabels _Py_translatelabels + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGENHEADERS_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/py_curses.h b/flaskwebproject/FlaskWebProject1/Include/py_curses.h new file mode 100644 index 0000000..b09dde4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/py_curses.h @@ -0,0 +1,178 @@ + +#ifndef Py_CURSES_H +#define Py_CURSES_H + +#ifdef __APPLE__ +/* +** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards +** against multiple definition of wchar_t. +*/ +#ifdef _BSD_WCHAR_T_DEFINED_ +#define _WCHAR_T +#endif +#endif /* __APPLE__ */ + +#ifdef __FreeBSD__ +/* +** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards +** against multiple definition of wchar_t and wint_t. +*/ +#ifdef _XOPEN_SOURCE_EXTENDED +#ifndef __FreeBSD_version +#include +#endif +#if __FreeBSD_version >= 500000 +#ifndef __wchar_t +#define __wchar_t +#endif +#ifndef __wint_t +#define __wint_t +#endif +#else +#ifndef _WCHAR_T +#define _WCHAR_T +#endif +#ifndef _WINT_T +#define _WINT_T +#endif +#endif +#endif +#endif + +#if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS) +/* The following definition is necessary for ncurses 5.7; without it, + some of [n]curses.h set NCURSES_OPAQUE to 1, and then Python + can't get at the WINDOW flags field. */ +#define NCURSES_OPAQUE 0 +#endif + +#ifdef HAVE_NCURSES_H +#include +#else +#include +#endif + +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has some or all these features. */ +#if !defined(WINDOW_HAS_FLAGS) && !(NCURSES_OPAQUE+0) +#define WINDOW_HAS_FLAGS 1 +#endif +#if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906 +#define HAVE_CURSES_IS_PAD 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCurses_API_pointers 4 + +/* Type declarations */ + +typedef struct { + PyObject_HEAD + WINDOW *win; + char *encoding; +} PyCursesWindowObject; + +#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) + +#define PyCurses_CAPSULE_NAME "_curses._C_API" + + +#ifdef CURSES_MODULE +/* This section is used when compiling _cursesmodule.c */ + +#else +/* This section is used in modules that use the _cursesmodule API */ + +static void **PyCurses_API; + +#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) +#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} +#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} +#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} + +#define import_curses() \ + PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); + +#endif + +/* general error messages */ +static const char catchall_ERR[] = "curses function returned ERR"; +static const char catchall_NULL[] = "curses function returned NULL"; + +/* Function Prototype Macros - They are ugly but very, very useful. ;-) + + X - function name + TYPE - parameter Type + ERGSTR - format string for construction of the return value + PARSESTR - format string for argument parsing + */ + +#define NoArgNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyCursesCheckERR(X(), # X); } + +#define NoArgOrFlagNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ +{ \ + int flag = 0; \ + PyCursesInitialised \ + switch(PyTuple_Size(args)) { \ + case 0: \ + return PyCursesCheckERR(X(), # X); \ + case 1: \ + if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ + if (flag) return PyCursesCheckERR(X(), # X); \ + else return PyCursesCheckERR(no ## X (), # X); \ + default: \ + PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ + return NULL; } } + +#define NoArgReturnIntFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyLong_FromLong((long) X()); } + + +#define NoArgReturnStringFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyBytes_FromString(X()); } + +#define NoArgTrueFalseFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + if (X () == FALSE) { \ + Py_INCREF(Py_False); \ + return Py_False; \ + } \ + Py_INCREF(Py_True); \ + return Py_True; } + +#define NoArgNoReturnVoidFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + X(); \ + Py_INCREF(Py_None); \ + return Py_None; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(Py_CURSES_H) */ + + diff --git a/flaskwebproject/FlaskWebProject1/Include/pyarena.h b/flaskwebproject/FlaskWebProject1/Include/pyarena.h new file mode 100644 index 0000000..db3ad01 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyarena.h @@ -0,0 +1,64 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_LIMITED_API +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + /* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); + + /* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyatomic.h b/flaskwebproject/FlaskWebProject1/Include/pyatomic.h new file mode 100644 index 0000000..893d30d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyatomic.h @@ -0,0 +1,250 @@ +#ifndef Py_ATOMIC_H +#define Py_ATOMIC_H +#ifdef Py_BUILD_CORE + +#include "dynamic_annotations.h" + +#include "pyconfig.h" + +#if defined(HAVE_STD_ATOMIC) +#include +#endif + +/* This is modeled after the atomics interface from C1x, according to + * the draft at + * http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf. + * Operations and types are named the same except with a _Py_ prefix + * and have the same semantics. + * + * Beware, the implementations here are deep magic. + */ + +#if defined(HAVE_STD_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = memory_order_relaxed, + _Py_memory_order_acquire = memory_order_acquire, + _Py_memory_order_release = memory_order_release, + _Py_memory_order_acq_rel = memory_order_acq_rel, + _Py_memory_order_seq_cst = memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + atomic_uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + atomic_int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) + +/* Use builtin atomic operations in GCC >= 4.7 */ +#elif defined(HAVE_BUILTIN_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = __ATOMIC_RELAXED, + _Py_memory_order_acquire = __ATOMIC_ACQUIRE, + _Py_memory_order_release = __ATOMIC_RELEASE, + _Py_memory_order_acq_rel = __ATOMIC_ACQ_REL, + _Py_memory_order_seq_cst = __ATOMIC_SEQ_CST +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + __atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + __atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_RELEASE), \ + __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_ACQUIRE \ + || (ORDER) == __ATOMIC_CONSUME), \ + __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) + +#else + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + +/* Only support GCC (for expression statements) and x86 (for simple + * atomic semantics) for now */ +#if defined(__GNUC__) && (defined(__i386__) || defined(__amd64)) + +static __inline__ void +_Py_atomic_signal_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("":::"memory"); +} + +static __inline__ void +_Py_atomic_thread_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("mfence":::"memory"); +} + +/* Tell the race checker about this operation's effects. */ +static __inline__ void +_Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order) +{ + (void)address; /* shut up -Wunused-parameter */ + switch(order) { + case _Py_memory_order_release: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_BEFORE(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_acquire: + break; + } + switch(order) { + case _Py_memory_order_acquire: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_AFTER(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_release: + break; + } +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) new_val = NEW_VAL;\ + volatile __typeof__(new_val) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + _Py_atomic_signal_fence(_Py_memory_order_release); \ + /* fallthrough */ \ + case _Py_memory_order_relaxed: \ + *volatile_data = new_val; \ + break; \ + \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + __asm__ volatile("xchg %0, %1" \ + : "+r"(new_val) \ + : "m"(atomic_val->_value) \ + : "memory"); \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_WRITES_END(); \ + }) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) result; \ + volatile __typeof__(result) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_READS_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are not releases by default, so need a */ \ + /* thread fence. */ \ + _Py_atomic_thread_fence(_Py_memory_order_release); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + result = *volatile_data; \ + switch(order) { \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are automatically acquire operations so */ \ + /* can get by with just a compiler fence. */ \ + _Py_atomic_signal_fence(_Py_memory_order_acquire); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_READS_END(); \ + result; \ + }) + +#else /* !gcc x86 */ +/* Fall back to other compilers and processors by assuming that simple + volatile accesses are atomic. This is false, so people should port + this. */ +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + ((ATOMIC_VAL)->_value = NEW_VAL) +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ((ATOMIC_VAL)->_value) + +#endif /* !gcc x86 */ +#endif + +/* Standardized shortcuts. */ +#define _Py_atomic_store(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_seq_cst) +#define _Py_atomic_load(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_seq_cst) + +/* Python-local extensions */ + +#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_relaxed) +#define _Py_atomic_load_relaxed(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed) + +#endif /* Py_BUILD_CORE */ +#endif /* Py_ATOMIC_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pycapsule.h b/flaskwebproject/FlaskWebProject1/Include/pycapsule.h new file mode 100644 index 0000000..d9ecda7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pycapsule.h @@ -0,0 +1,59 @@ + +/* Capsule objects let you wrap a C "void *" pointer in a Python + object. They're a way of passing data through the Python interpreter + without creating your own custom type. + + Capsules are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + + For more information, please see "c-api/capsule.html" in the + documentation. +*/ + +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCapsule_Type; + +typedef void (*PyCapsule_Destructor)(PyObject *); + +#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) + + +PyAPI_FUNC(PyObject *) PyCapsule_New( + void *pointer, + const char *name, + PyCapsule_Destructor destructor); + +PyAPI_FUNC(void *) PyCapsule_GetPointer(PyObject *capsule, const char *name); + +PyAPI_FUNC(PyCapsule_Destructor) PyCapsule_GetDestructor(PyObject *capsule); + +PyAPI_FUNC(const char *) PyCapsule_GetName(PyObject *capsule); + +PyAPI_FUNC(void *) PyCapsule_GetContext(PyObject *capsule); + +PyAPI_FUNC(int) PyCapsule_IsValid(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetPointer(PyObject *capsule, void *pointer); + +PyAPI_FUNC(int) PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor); + +PyAPI_FUNC(int) PyCapsule_SetName(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetContext(PyObject *capsule, void *context); + +PyAPI_FUNC(void *) PyCapsule_Import( + const char *name, /* UTF-8 encoded string */ + int no_block); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CAPSULE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyconfig.h b/flaskwebproject/FlaskWebProject1/Include/pyconfig.h new file mode 100644 index 0000000..64e7aec --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyconfig.h @@ -0,0 +1,687 @@ +#ifndef Py_CONFIG_H +#define Py_CONFIG_H + +/* pyconfig.h. NOT Generated automatically by configure. + +This is a manually maintained version used for the Watcom, +Borland and Microsoft Visual C++ compilers. It is a +standard part of the Python distribution. + +WINDOWS DEFINES: +The code specific to Windows should be wrapped around one of +the following #defines + +MS_WIN64 - Code specific to the MS Win64 API +MS_WIN32 - Code specific to the MS Win32 (and Win64) API (obsolete, this covers all supported APIs) +MS_WINDOWS - Code specific to Windows, but all versions. +Py_ENABLE_SHARED - Code if the Python core is built as a DLL. + +Also note that neither "_M_IX86" or "_MSC_VER" should be used for +any purpose other than "Windows Intel x86 specific" and "Microsoft +compiler specific". Therefore, these should be very rare. + + +NOTE: The following symbols are deprecated: +NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT +MS_CORE_DLL. + +WIN32 is still required for the locale module. + +*/ + +/* Deprecated USE_DL_EXPORT macro - please use Py_BUILD_CORE */ +#ifdef USE_DL_EXPORT +# define Py_BUILD_CORE +#endif /* USE_DL_EXPORT */ + +/* Visual Studio 2005 introduces deprecation warnings for + "insecure" and POSIX functions. The insecure functions should + be replaced by *_s versions (according to Microsoft); the + POSIX functions by _* versions (which, according to Microsoft, + would be ISO C conforming). Neither renaming is feasible, so + we just silence the warnings. */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + +#define HAVE_IO_H +#define HAVE_SYS_UTIME_H +#define HAVE_TEMPNAM +#define HAVE_TMPFILE +#define HAVE_TMPNAM +#define HAVE_CLOCK +#define HAVE_STRERROR + +#include + +#define HAVE_HYPOT +#define HAVE_STRFTIME +#define DONT_HAVE_SIG_ALARM +#define DONT_HAVE_SIG_PAUSE +#define LONG_BIT 32 +#define WORD_BIT 32 + +#define MS_WIN32 /* only support win32 and greater. */ +#define MS_WINDOWS +#ifndef PYTHONPATH +# define PYTHONPATH L".\\DLLs;.\\lib" +#endif +#define NT_THREADS +#define WITH_THREAD +#ifndef NETSCAPE_PI +#define USE_SOCKET +#endif + + +/* Compiler specific defines */ + +/* ------------------------------------------------------------------------*/ +/* Microsoft C defines _MSC_VER */ +#ifdef _MSC_VER + +/* We want COMPILER to expand to a string containing _MSC_VER's *value*. + * This is horridly tricky, because the stringization operator only works + * on macro arguments, and doesn't evaluate macros passed *as* arguments. + * Attempts simpler than the following appear doomed to produce "_MSC_VER" + * literally in the string. + */ +#define _Py_PASTE_VERSION(SUFFIX) \ + ("[MSC v." _Py_STRINGIZE(_MSC_VER) " " SUFFIX "]") +/* e.g., this produces, after compile-time string catenation, + * ("[MSC v.1200 32 bit (Intel)]") + * + * _Py_STRINGIZE(_MSC_VER) expands to + * _Py_STRINGIZE1((_MSC_VER)) expands to + * _Py_STRINGIZE2(_MSC_VER) but as this call is the result of token-pasting + * it's scanned again for macros and so further expands to (under MSVC 6) + * _Py_STRINGIZE2(1200) which then expands to + * "1200" + */ +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X + +/* MSVC defines _WINxx to differentiate the windows platform types + + Note that for compatibility reasons _WIN32 is defined on Win32 + *and* on Win64. For the same reasons, in Python, MS_WIN32 is + defined on Win32 *and* Win64. Win32 only code must therefore be + guarded as follows: + #if defined(MS_WIN32) && !defined(MS_WIN64) + Some modules are disabled on Itanium processors, therefore we + have MS_WINI64 set for those targets, otherwise MS_WINX64 +*/ +#ifdef _WIN64 +#define MS_WIN64 +#endif + +/* set the COMPILER */ +#ifdef MS_WIN64 +#if defined(_M_IA64) +#define COMPILER _Py_PASTE_VERSION("64 bit (Itanium)") +#define MS_WINI64 +#define PYD_PLATFORM_TAG "win_ia64" +#elif defined(_M_X64) || defined(_M_AMD64) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") +#endif /* __INTEL_COMPILER */ +#define MS_WINX64 +#define PYD_PLATFORM_TAG "win_amd64" +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") +#endif +#endif /* MS_WIN64 */ + +/* set the version macros for the windows headers */ +/* Python 3.5+ requires Windows Vista or greater */ +#define Py_WINVER 0x0600 /* _WIN32_WINNT_VISTA */ +#define Py_NTDDI NTDDI_VISTA + +/* We only set these values when building Python - we don't want to force + these values on extensions, as that will affect the prototypes and + structures exposed in the Windows headers. Even when building Python, we + allow a single source file to override this - they may need access to + structures etc so it can optionally use new Windows features if it + determines at runtime they are available. +*/ +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_MODULE) +#ifndef NTDDI_VERSION +#define NTDDI_VERSION Py_NTDDI +#endif +#ifndef WINVER +#define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT Py_WINVER +#endif +#endif + +/* _W64 is not defined for VC6 or eVC4 */ +#ifndef _W64 +#define _W64 +#endif + +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + +#if defined(MS_WIN32) && !defined(MS_WIN64) +#if defined(_M_IX86) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 32 bit (Intel) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") +#endif /* __INTEL_COMPILER */ +#define PYD_PLATFORM_TAG "win32" +#elif defined(_M_ARM) +#define COMPILER _Py_PASTE_VERSION("32 bit (ARM)") +#define PYD_PLATFORM_TAG "win_arm" +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Unknown)") +#endif +#endif /* MS_WIN32 && !MS_WIN64 */ + +typedef int pid_t; + +#include +#define Py_IS_NAN _isnan +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) +#define copysign _copysign + +/* VS 2010 and above already defines hypot as _hypot */ +#if _MSC_VER < 1600 +#define hypot _hypot +#endif + +/* VS 2015 defines these names with a leading underscore */ +#if _MSC_VER >= 1900 +#define timezone _timezone +#define daylight _daylight +#define tzname _tzname +#endif + +/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ +#if _MSC_VER >= 1400 && _MSC_VER < 1600 +#define HAVE_SXS 1 +#endif + +/* define some ANSI types that are not defined in earlier Win headers */ +#if _MSC_VER >= 1200 +/* This file only exists in VC 6.0 or higher */ +#include +#endif + +#endif /* _MSC_VER */ + +/* ------------------------------------------------------------------------*/ +/* egcs/gnu-win32 defines __GNUC__ and _WIN32 */ +#if defined(__GNUC__) && defined(_WIN32) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ +/* Suggested by Rene Liebscher to avoid a GCC 2.91.* + bug that requires structure imports. More recent versions of the + compiler don't exhibit this bug. +*/ +#if (__GNUC__==2) && (__GNUC_MINOR__<=91) +#warning "Please use an up-to-date version of gcc! (>2.91 recommended)" +#endif + +#define COMPILER "[gcc]" +#define hypot _hypot +#define PY_LONG_LONG long long +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif /* GNUC */ + +/* ------------------------------------------------------------------------*/ +/* lcc-win32 defines __LCC__ */ +#if defined(__LCC__) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ + +#define COMPILER "[lcc-win32]" +typedef int pid_t; +/* __declspec() is supported here too - do nothing to get the defaults */ + +#endif /* LCC */ + +/* ------------------------------------------------------------------------*/ +/* End of compilers - finish up */ + +#ifndef NO_STDIO_H +# include +#endif + +/* 64 bit ints are usually spelt __int64 unless compiler has overridden */ +#ifndef PY_LONG_LONG +# define PY_LONG_LONG __int64 +# define PY_LLONG_MAX _I64_MAX +# define PY_LLONG_MIN _I64_MIN +# define PY_ULLONG_MAX _UI64_MAX +#endif + +/* For Windows the Python core is in a DLL by default. Test +Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ +#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED) +# define Py_ENABLE_SHARED 1 /* standard symbol for shared library */ +# define MS_COREDLL /* deprecated old symbol */ +#endif /* !MS_NO_COREDLL && ... */ + +/* All windows compilers that use this header support __declspec */ +#define HAVE_DECLSPEC_DLL + +/* For an MSVC DLL, we can nominate the .lib files used by extensions */ +#ifdef MS_COREDLL +# ifndef Py_BUILD_CORE /* not building the core - must be an ext */ +# if defined(_MSC_VER) + /* So MSVC users need not specify the .lib file in + their Makefile (other compilers are generally + taken care of by distutils.) */ +# if defined(_DEBUG) +# pragma comment(lib,"python36_d.lib") +# elif defined(Py_LIMITED_API) +# pragma comment(lib,"python3.lib") +# else +# pragma comment(lib,"python36.lib") +# endif /* _DEBUG */ +# endif /* _MSC_VER */ +# endif /* Py_BUILD_CORE */ +#endif /* MS_COREDLL */ + +#if defined(MS_WIN64) +/* maintain "win32" sys.platform for backward compatibility of Python code, + the Win64 API should be close enough to the Win32 API to make this + preferable */ +# define PLATFORM "win32" +# define SIZEOF_VOID_P 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 +/* configure.ac defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, + sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + On Win64 the second condition is not true, but if fpos_t replaces off_t + then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 + should define this. */ +# define HAVE_LARGEFILE_SUPPORT +#elif defined(MS_WIN32) +# define PLATFORM "win32" +# define HAVE_LARGEFILE_SUPPORT +# define SIZEOF_VOID_P 4 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 + /* MS VS2005 changes time_t to a 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif +#endif + +#ifdef _DEBUG +# define Py_DEBUG +#endif + + +#ifdef MS_WIN32 + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_FLOAT 4 + +/* VC 7.1 has them and VC 6.0 does not. VC 6.0 has a version number of 1200. + Microsoft eMbedded Visual C++ 4.0 has a version number of 1201 and doesn't + define these. + If some compiler does not provide them, modify the #if appropriately. */ +#if defined(_MSC_VER) +#if _MSC_VER > 1300 +#define HAVE_UINTPTR_T 1 +#define HAVE_INTPTR_T 1 +#else +/* VC6, VS 2002 and eVC4 don't support the C99 LL suffix for 64-bit integer literals */ +#define Py_LL(x) x##I64 +#endif /* _MSC_VER > 1300 */ +#endif /* _MSC_VER */ + +#endif + +/* define signed and unsigned exact-width 32-bit and 64-bit types, used in the + implementation of Python integers. */ +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* Fairly standard from here! */ + +/* Define to 1 if you have the `copysign' function. */ +#define HAVE_COPYSIGN 1 + +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + +/* Define to 1 if you have the `isinf' macro. */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_DECL_ISNAN 1 + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #define const */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CONIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRECT_H 1 + +/* Define if you have dirent.h. */ +/* #define DIRENT 1 */ + +/* Define to the type of elements in the array set by `getgroups'. + Usually this is either `int' or `gid_t'. */ +/* #undef GETGROUPS_T */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define if you don't have dirent.h, but have ndir.h. */ +/* #undef NDIR */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you don't have dirent.h, but have sys/dir.h. */ +/* #undef SYSDIR */ + +/* Define if you don't have dirent.h, but have sys/ndir.h. */ +/* #undef SYSNDIR */ + +/* Define if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define if your declares struct tm. */ +/* #define TM_IN_SYS_TIME 1 */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the closedir function returns void instead of int. */ +/* #undef VOID_CLOSEDIR */ + +/* Define if getpgrp() must be called as getpgrp(0) + and (consequently) setpgrp() as setpgrp(0, 0). */ +/* #undef GETPGRP_HAVE_ARGS */ + +/* Define this if your time.h defines altzone */ +/* #define HAVE_ALTZONE */ + +/* Define if you have the putenv function. */ +#define HAVE_PUTENV + +/* Define if your compiler supports function prototypes */ +#define HAVE_PROTOTYPES + +/* Define if you can safely include both and + (which you can't on SCO ODT 3.0). */ +/* #undef SYS_SELECT_WITH_SYS_TIME */ + +/* Define if you want documentation strings in extension modules */ +#define WITH_DOC_STRINGS 1 + +/* Define if you want to compile in rudimentary thread support */ +/* #undef WITH_THREAD */ + +/* Define if you want to use the GNU readline library */ +/* #define WITH_READLINE 1 */ + +/* Use Python's own small-block memory-allocator. */ +#define WITH_PYMALLOC 1 + +/* Define if you have clock. */ +/* #define HAVE_CLOCK */ + +/* Define when any dynamic module loading is enabled */ +#define HAVE_DYNAMIC_LOADING + +/* Define if you have ftime. */ +#define HAVE_FTIME + +/* Define if you have getpeername. */ +#define HAVE_GETPEERNAME + +/* Define if you have getpgrp. */ +/* #undef HAVE_GETPGRP */ + +/* Define if you have getpid. */ +#define HAVE_GETPID + +/* Define if you have gettimeofday. */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have getwd. */ +/* #undef HAVE_GETWD */ + +/* Define if you have lstat. */ +/* #undef HAVE_LSTAT */ + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME + +/* Define if you have nice. */ +/* #undef HAVE_NICE */ + +/* Define if you have readlink. */ +/* #undef HAVE_READLINK */ + +/* Define if you have select. */ +/* #undef HAVE_SELECT */ + +/* Define if you have setpgid. */ +/* #undef HAVE_SETPGID */ + +/* Define if you have setpgrp. */ +/* #undef HAVE_SETPGRP */ + +/* Define if you have setsid. */ +/* #undef HAVE_SETSID */ + +/* Define if you have setvbuf. */ +#define HAVE_SETVBUF + +/* Define if you have siginterrupt. */ +/* #undef HAVE_SIGINTERRUPT */ + +/* Define if you have symlink. */ +/* #undef HAVE_SYMLINK */ + +/* Define if you have tcgetpgrp. */ +/* #undef HAVE_TCGETPGRP */ + +/* Define if you have tcsetpgrp. */ +/* #undef HAVE_TCSETPGRP */ + +/* Define if you have times. */ +/* #undef HAVE_TIMES */ + +/* Define if you have uname. */ +/* #undef HAVE_UNAME */ + +/* Define if you have waitpid. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the `wcsftime' function. */ +#if defined(_MSC_VER) && _MSC_VER >= 1310 +#define HAVE_WCSFTIME 1 +#endif + +/* Define to 1 if you have the `wcscoll' function. */ +#define HAVE_WCSCOLL 1 + +/* Define to 1 if you have the `wcsxfrm' function. */ +#define HAVE_WCSXFRM 1 + +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + +/* Define if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PROCESS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define if you have the prototypes. */ +#define HAVE_STDARG_PROTOTYPES + +/* Define if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_AUDIOIO_H */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UTIME_H 1 */ + +/* Define if the compiler provides a wchar.h header file. */ +#define HAVE_WCHAR_H 1 + +/* The size of `wchar_t', as computed by sizeof. */ +#define SIZEOF_WCHAR_T 2 + +/* The size of `_Bool', as computed by sizeof. */ +#define SIZEOF__BOOL 1 + +/* The size of `pid_t', as computed by sizeof. */ +#define SIZEOF_PID_T SIZEOF_INT + +/* Define if you have the dl library (-ldl). */ +/* #undef HAVE_LIBDL */ + +/* Define if you have the mpc library (-lmpc). */ +/* #undef HAVE_LIBMPC */ + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the seq library (-lseq). */ +/* #undef HAVE_LIBSEQ */ + +/* Define if you have the socket library (-lsocket). */ +#define HAVE_LIBSOCKET 1 + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define if you have the termcap library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if you have the termlib library (-ltermlib). */ +/* #undef HAVE_LIBTERMLIB */ + +/* Define if you have the thread library (-lthread). */ +/* #undef HAVE_LIBTHREAD */ + +/* WinSock does not use a bitmask in select, and uses + socket handles greater than FD_SETSIZE */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the + least significant byte first */ +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 + +#endif /* !Py_CONFIG_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyctype.h b/flaskwebproject/FlaskWebProject1/Include/pyctype.h new file mode 100644 index 0000000..6bce63e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyctype.h @@ -0,0 +1,33 @@ +#ifndef Py_LIMITED_API +#ifndef PYCTYPE_H +#define PYCTYPE_H + +#define PY_CTF_LOWER 0x01 +#define PY_CTF_UPPER 0x02 +#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER) +#define PY_CTF_DIGIT 0x04 +#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT) +#define PY_CTF_SPACE 0x08 +#define PY_CTF_XDIGIT 0x10 + +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; + +/* Unlike their C counterparts, the following macros are not meant to + * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument + * must be a signed/unsigned char. */ +#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER) +#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER) +#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA) +#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT) +#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT) +#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) +#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) + +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; + +#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) +#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) + +#endif /* !PYCTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pydebug.h b/flaskwebproject/FlaskWebProject1/Include/pydebug.h new file mode 100644 index 0000000..6e23a89 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pydebug.h @@ -0,0 +1,40 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYDEBUG_H +#define Py_PYDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + +/* These global variable are defined in pylifecycle.c */ +/* XXX (ncoghlan): move these declarations to pylifecycle.h? */ +PyAPI_DATA(int) Py_DebugFlag; +PyAPI_DATA(int) Py_VerboseFlag; +PyAPI_DATA(int) Py_QuietFlag; +PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; +PyAPI_DATA(int) Py_OptimizeFlag; +PyAPI_DATA(int) Py_NoSiteFlag; +PyAPI_DATA(int) Py_BytesWarningFlag; +PyAPI_DATA(int) Py_UseClassExceptionsFlag; +PyAPI_DATA(int) Py_FrozenFlag; +PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +PyAPI_DATA(int) Py_NoUserSiteDirectory; +PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; +PyAPI_DATA(int) Py_IsolatedFlag; + +#ifdef MS_WINDOWS +PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; +#endif + +/* this is a wrapper around getenv() that pays attention to + Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PYTHONPATH and PYTHONHOME from the environment */ +#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYDEBUG_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pydtrace.h b/flaskwebproject/FlaskWebProject1/Include/pydtrace.h new file mode 100644 index 0000000..c43a253 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pydtrace.h @@ -0,0 +1,53 @@ +/* Static DTrace probes interface */ + +#ifndef Py_DTRACE_H +#define Py_DTRACE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WITH_DTRACE + +#include "pydtrace_probes.h" + +/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include + `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe + defined in pydtrace_provider.d. + + Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()` + check to minimize performance impact when probing is off. For example: + + if (PyDTrace_FUNCTION_ENTRY_ENABLED()) + PyDTrace_FUNCTION_ENTRY(f); +*/ + +#else + +/* Without DTrace, compile to nothing. */ + +static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_GC_START(int arg0) {} +static inline void PyDTrace_GC_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} + +static inline int PyDTrace_LINE_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_START_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } + +#endif /* !WITH_DTRACE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DTRACE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyerrors.h b/flaskwebproject/FlaskWebProject1/Include/pyerrors.h new file mode 100644 index 0000000..c28c137 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyerrors.h @@ -0,0 +1,503 @@ +#ifndef Py_ERRORS_H +#define Py_ERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Error objects */ + +#ifndef Py_LIMITED_API +/* PyException_HEAD defines the initial segment of every exception class. */ +#define PyException_HEAD PyObject_HEAD PyObject *dict;\ + PyObject *args; PyObject *traceback;\ + PyObject *context; PyObject *cause;\ + char suppress_context; + +typedef struct { + PyException_HEAD +} PyBaseExceptionObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *filename; + PyObject *lineno; + PyObject *offset; + PyObject *text; + PyObject *print_file_and_line; +} PySyntaxErrorObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *name; + PyObject *path; +} PyImportErrorObject; + +typedef struct { + PyException_HEAD + PyObject *encoding; + PyObject *object; + Py_ssize_t start; + Py_ssize_t end; + PyObject *reason; +} PyUnicodeErrorObject; + +typedef struct { + PyException_HEAD + PyObject *code; +} PySystemExitObject; + +typedef struct { + PyException_HEAD + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; + PyObject *filename2; +#ifdef MS_WINDOWS + PyObject *winerror; +#endif + Py_ssize_t written; /* only for BlockingIOError, -1 otherwise */ +} PyOSErrorObject; + +typedef struct { + PyException_HEAD + PyObject *value; +} PyStopIterationObject; + +/* Compatibility typedefs */ +typedef PyOSErrorObject PyEnvironmentErrorObject; +#ifdef MS_WINDOWS +typedef PyOSErrorObject PyWindowsErrorObject; +#endif +#endif /* !Py_LIMITED_API */ + +/* Error handling definitions */ + +PyAPI_FUNC(void) PyErr_SetNone(PyObject *); +PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); +#endif +PyAPI_FUNC(void) PyErr_SetString( + PyObject *exception, + const char *string /* decoded from utf-8 */ + ); +PyAPI_FUNC(PyObject *) PyErr_Occurred(void); +PyAPI_FUNC(void) PyErr_Clear(void); +PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); +#endif + +#if defined(__clang__) || \ + (defined(__GNUC_MAJOR__) && \ + ((__GNUC_MAJOR__ >= 3) || \ + (__GNUC_MAJOR__ == 2) && (__GNUC_MINOR__ >= 5))) +#define _Py_NO_RETURN __attribute__((__noreturn__)) +#else +#define _Py_NO_RETURN +#endif + +/* Defined in Python/pylifecycle.c */ +PyAPI_FUNC(void) Py_FatalError(const char *message) _Py_NO_RETURN; + +#if defined(Py_DEBUG) || defined(Py_LIMITED_API) +#define _PyErr_OCCURRED() PyErr_Occurred() +#else +#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) +#endif + +/* Error testing and normalization */ +PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); +PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); +PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); + +/* Traceback manipulation (PEP 3134) */ +PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *); + +/* Cause manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *); +PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *); + +/* Context manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *); +PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); +#endif + +/* */ + +#define PyExceptionClass_Check(x) \ + (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define PyExceptionInstance_Check(x) \ + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + +#define PyExceptionClass_Name(x) \ + ((char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) + + +/* Predefined exceptions */ + +PyAPI_DATA(PyObject *) PyExc_BaseException; +PyAPI_DATA(PyObject *) PyExc_Exception; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration; +#endif +PyAPI_DATA(PyObject *) PyExc_StopIteration; +PyAPI_DATA(PyObject *) PyExc_GeneratorExit; +PyAPI_DATA(PyObject *) PyExc_ArithmeticError; +PyAPI_DATA(PyObject *) PyExc_LookupError; + +PyAPI_DATA(PyObject *) PyExc_AssertionError; +PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_BufferError; +PyAPI_DATA(PyObject *) PyExc_EOFError; +PyAPI_DATA(PyObject *) PyExc_FloatingPointError; +PyAPI_DATA(PyObject *) PyExc_OSError; +PyAPI_DATA(PyObject *) PyExc_ImportError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError; +#endif +PyAPI_DATA(PyObject *) PyExc_IndexError; +PyAPI_DATA(PyObject *) PyExc_KeyError; +PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; +PyAPI_DATA(PyObject *) PyExc_MemoryError; +PyAPI_DATA(PyObject *) PyExc_NameError; +PyAPI_DATA(PyObject *) PyExc_OverflowError; +PyAPI_DATA(PyObject *) PyExc_RuntimeError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_RecursionError; +#endif +PyAPI_DATA(PyObject *) PyExc_NotImplementedError; +PyAPI_DATA(PyObject *) PyExc_SyntaxError; +PyAPI_DATA(PyObject *) PyExc_IndentationError; +PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ReferenceError; +PyAPI_DATA(PyObject *) PyExc_SystemError; +PyAPI_DATA(PyObject *) PyExc_SystemExit; +PyAPI_DATA(PyObject *) PyExc_TypeError; +PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; +PyAPI_DATA(PyObject *) PyExc_UnicodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; +PyAPI_DATA(PyObject *) PyExc_ValueError; +PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_DATA(PyObject *) PyExc_BlockingIOError; +PyAPI_DATA(PyObject *) PyExc_BrokenPipeError; +PyAPI_DATA(PyObject *) PyExc_ChildProcessError; +PyAPI_DATA(PyObject *) PyExc_ConnectionError; +PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionResetError; +PyAPI_DATA(PyObject *) PyExc_FileExistsError; +PyAPI_DATA(PyObject *) PyExc_FileNotFoundError; +PyAPI_DATA(PyObject *) PyExc_InterruptedError; +PyAPI_DATA(PyObject *) PyExc_IsADirectoryError; +PyAPI_DATA(PyObject *) PyExc_NotADirectoryError; +PyAPI_DATA(PyObject *) PyExc_PermissionError; +PyAPI_DATA(PyObject *) PyExc_ProcessLookupError; +PyAPI_DATA(PyObject *) PyExc_TimeoutError; +#endif + + +/* Compatibility aliases */ +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; +#ifdef MS_WINDOWS +PyAPI_DATA(PyObject *) PyExc_WindowsError; +#endif + +/* Predefined warning categories */ +PyAPI_DATA(PyObject *) PyExc_Warning; +PyAPI_DATA(PyObject *) PyExc_UserWarning; +PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; +PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; +PyAPI_DATA(PyObject *) PyExc_FutureWarning; +PyAPI_DATA(PyObject *) PyExc_ImportWarning; +PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; +PyAPI_DATA(PyObject *) PyExc_BytesWarning; +PyAPI_DATA(PyObject *) PyExc_ResourceWarning; + + +/* Convenience functions */ + +PyAPI_FUNC(int) PyErr_BadArgument(void); +PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects( + PyObject *, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( + PyObject *exc, + const char *filename /* decoded from the filesystem encoding */ + ); +#if defined(MS_WINDOWS) && !defined(Py_LIMITED_API) +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( + PyObject *, const Py_UNICODE *); +#endif /* MS_WINDOWS */ + +PyAPI_FUNC(PyObject *) PyErr_Format( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyErr_FormatV( + PyObject *exception, + const char *format, + va_list vargs); +#endif + +#ifndef Py_LIMITED_API +/* Like PyErr_Format(), but saves current exception as __context__ and + __cause__. + */ +PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#endif + +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +/* XXX redeclare to use WSTRING */ +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( + int, const Py_UNICODE *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( + PyObject *,int, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyObject *,int, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( + PyObject *exc, + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( + PyObject *,int, const Py_UNICODE *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); +#endif /* MS_WINDOWS */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *, + PyObject *); +#endif + +/* Export the old function so that the existing API remains available: */ +PyAPI_FUNC(void) PyErr_BadInternalCall(void); +PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno); +/* Mask the old API with a call to the new API for code compiled under + Python 2.0: */ +#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) + +/* Function to create a new exception */ +PyAPI_FUNC(PyObject *) PyErr_NewException( + const char *name, PyObject *base, PyObject *dict); +PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( + const char *name, const char *doc, PyObject *base, PyObject *dict); +PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); + +/* In exceptions.c */ +#ifndef Py_LIMITED_API +/* Helper that attempts to replace the current exception with one of the + * same type but with a prefix added to the exception text. The resulting + * exception description looks like: + * + * prefix (exc_type: original_exc_str) + * + * Only some exceptions can be safely replaced. If the function determines + * it isn't safe to perform the replacement, it will leave the original + * unmodified exception in place. + * + * Returns a borrowed reference to the new exception (if any), NULL if the + * existing exception was left in place. + */ +PyAPI_FUNC(PyObject *) _PyErr_TrySetFromCause( + const char *prefix_format, /* ASCII-encoded string */ + ... + ); +#endif + + +/* In sigcheck.c or signalmodule.c */ +PyAPI_FUNC(int) PyErr_CheckSignals(void); +PyAPI_FUNC(void) PyErr_SetInterrupt(void); + +/* In signalmodule.c */ +#ifndef Py_LIMITED_API +int PySignal_SetWakeupFd(int fd); +#endif + +/* Support for adding program text to SyntaxErrors */ +PyAPI_FUNC(void) PyErr_SyntaxLocation( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +PyAPI_FUNC(void) PyErr_SyntaxLocationEx( + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + int col_offset); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyErr_SyntaxLocationObject( + PyObject *filename, + int lineno, + int col_offset); +#endif +PyAPI_FUNC(PyObject *) PyErr_ProgramText( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( + PyObject *filename, + int lineno); +#endif + +/* The following functions are used to create and modify unicode + exceptions from C */ + +/* create a UnicodeDecodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const char *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); + +/* create a UnicodeEncodeError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); +#endif + +/* create a UnicodeTranslateError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( + PyObject *object, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); +#endif + +/* get the encoding attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); + +/* get the object attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); + +/* get the value of the start attribute (the int * may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); + +/* assign a new value to the start attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); + +/* get the value of the end attribute (the int *may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); + +/* assign a new value to the end attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); + +/* get the value of the reason attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); + +/* assign a new value to the reason attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); + +/* These APIs aren't really part of the error implementation, but + often needed to format error messages; the native C lib APIs are + not available on all platforms, which is why we provide emulations + for those platforms in Python/mysnprintf.c, + WARNING: The return value of snprintf varies across platforms; do + not rely on any particular behavior; eventually the C99 defn may + be reliable. +*/ +#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) +# define HAVE_SNPRINTF +# define snprintf _snprintf +# define vsnprintf _vsnprintf +#endif + +#include +PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 3, 4))); +PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRORS_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyexpat.h b/flaskwebproject/FlaskWebProject1/Include/pyexpat.h new file mode 100644 index 0000000..44259bf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyexpat.h @@ -0,0 +1,53 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0" +#define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI" + +struct PyExpat_CAPI +{ + char* magic; /* set to PyExpat_CAPI_MAGIC */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ + int MAJOR_VERSION; + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + XML_Size (*GetErrorColumnNumber)(XML_Parser parser); + XML_Size (*GetErrorLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + void (*SetStartDoctypeDeclHandler)(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding); + int (*DefaultUnknownEncodingHandler)( + void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); + /* always add new stuff to the end! */ +}; + diff --git a/flaskwebproject/FlaskWebProject1/Include/pyfpe.h b/flaskwebproject/FlaskWebProject1/Include/pyfpe.h new file mode 100644 index 0000000..f9a15e6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyfpe.h @@ -0,0 +1,176 @@ +#ifndef Py_PYFPE_H +#define Py_PYFPE_H +#ifdef __cplusplus +extern "C" { +#endif +/* + --------------------------------------------------------------------- + / Copyright (c) 1996. \ + | The Regents of the University of California. | + | All rights reserved. | + | | + | Permission to use, copy, modify, and distribute this software for | + | any purpose without fee is hereby granted, provided that this en- | + | tire notice is included in all copies of any software which is or | + | includes a copy or modification of this software and in all | + | copies of the supporting documentation for such software. | + | | + | This work was produced at the University of California, Lawrence | + | Livermore National Laboratory under contract no. W-7405-ENG-48 | + | between the U.S. Department of Energy and The Regents of the | + | University of California for the operation of UC LLNL. | + | | + | DISCLAIMER | + | | + | This software was prepared as an account of work sponsored by an | + | agency of the United States Government. Neither the United States | + | Government nor the University of California nor any of their em- | + | ployees, makes any warranty, express or implied, or assumes any | + | liability or responsibility for the accuracy, completeness, or | + | usefulness of any information, apparatus, product, or process | + | disclosed, or represents that its use would not infringe | + | privately-owned rights. Reference herein to any specific commer- | + | cial products, process, or service by trade name, trademark, | + | manufacturer, or otherwise, does not necessarily constitute or | + | imply its endorsement, recommendation, or favoring by the United | + | States Government or the University of California. The views and | + | opinions of authors expressed herein do not necessarily state or | + | reflect those of the United States Government or the University | + | of California, and shall not be used for advertising or product | + \ endorsement purposes. / + --------------------------------------------------------------------- +*/ + +/* + * Define macros for handling SIGFPE. + * Lee Busby, LLNL, November, 1996 + * busby1@llnl.gov + * + ********************************************* + * Overview of the system for handling SIGFPE: + * + * This file (Include/pyfpe.h) defines a couple of "wrapper" macros for + * insertion into your Python C code of choice. Their proper use is + * discussed below. The file Python/pyfpe.c defines a pair of global + * variables PyFPE_jbuf and PyFPE_counter which are used by the signal + * handler for SIGFPE to decide if a particular exception was protected + * by the macros. The signal handler itself, and code for enabling the + * generation of SIGFPE in the first place, is in a (new) Python module + * named fpectl. This module is standard in every respect. It can be loaded + * either statically or dynamically as you choose, and like any other + * Python module, has no effect until you import it. + * + * In the general case, there are three steps toward handling SIGFPE in any + * Python code: + * + * 1) Add the *_PROTECT macros to your C code as required to protect + * dangerous floating point sections. + * + * 2) Turn on the inclusion of the code by adding the ``--with-fpectl'' + * flag at the time you run configure. If the fpectl or other modules + * which use the *_PROTECT macros are to be dynamically loaded, be + * sure they are compiled with WANT_SIGFPE_HANDLER defined. + * + * 3) When python is built and running, import fpectl, and execute + * fpectl.turnon_sigfpe(). This sets up the signal handler and enables + * generation of SIGFPE whenever an exception occurs. From this point + * on, any properly trapped SIGFPE should result in the Python + * FloatingPointError exception. + * + * Step 1 has been done already for the Python kernel code, and should be + * done soon for the NumPy array package. Step 2 is usually done once at + * python install time. Python's behavior with respect to SIGFPE is not + * changed unless you also do step 3. Thus you can control this new + * facility at compile time, or run time, or both. + * + ******************************** + * Using the macros in your code: + * + * static PyObject *foobar(PyObject *self,PyObject *args) + * { + * .... + * PyFPE_START_PROTECT("Error in foobar", return 0) + * result = dangerous_op(somearg1, somearg2, ...); + * PyFPE_END_PROTECT(result) + * .... + * } + * + * If a floating point error occurs in dangerous_op, foobar returns 0 (NULL), + * after setting the associated value of the FloatingPointError exception to + * "Error in foobar". ``Dangerous_op'' can be a single operation, or a block + * of code, function calls, or any combination, so long as no alternate + * return is possible before the PyFPE_END_PROTECT macro is reached. + * + * The macros can only be used in a function context where an error return + * can be recognized as signaling a Python exception. (Generally, most + * functions that return a PyObject * will qualify.) + * + * Guido's original design suggestion for PyFPE_START_PROTECT and + * PyFPE_END_PROTECT had them open and close a local block, with a locally + * defined jmp_buf and jmp_buf pointer. This would allow recursive nesting + * of the macros. The Ansi C standard makes it clear that such local + * variables need to be declared with the "volatile" type qualifier to keep + * setjmp from corrupting their values. Some current implementations seem + * to be more restrictive. For example, the HPUX man page for setjmp says + * + * Upon the return from a setjmp() call caused by a longjmp(), the + * values of any non-static local variables belonging to the routine + * from which setjmp() was called are undefined. Code which depends on + * such values is not guaranteed to be portable. + * + * I therefore decided on a more limited form of nesting, using a counter + * variable (PyFPE_counter) to keep track of any recursion. If an exception + * occurs in an ``inner'' pair of macros, the return will apparently + * come from the outermost level. + * + */ + +#ifdef WANT_SIGFPE_HANDLER +#include +#include +#include +extern jmp_buf PyFPE_jbuf; +extern int PyFPE_counter; +extern double PyFPE_dummy(void *); + +#define PyFPE_START_PROTECT(err_string, leave_stmt) \ +if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \ + PyErr_SetString(PyExc_FloatingPointError, err_string); \ + PyFPE_counter = 0; \ + leave_stmt; \ +} + +/* + * This (following) is a heck of a way to decrement a counter. However, + * unless the macro argument is provided, code optimizers will sometimes move + * this statement so that it gets executed *before* the unsafe expression + * which we're trying to protect. That pretty well messes things up, + * of course. + * + * If the expression(s) you're trying to protect don't happen to return a + * value, you will need to manufacture a dummy result just to preserve the + * correct ordering of statements. Note that the macro passes the address + * of its argument (so you need to give it something which is addressable). + * If your expression returns multiple results, pass the last such result + * to PyFPE_END_PROTECT. + * + * Note that PyFPE_dummy returns a double, which is cast to int. + * This seeming insanity is to tickle the Floating Point Unit (FPU). + * If an exception has occurred in a preceding floating point operation, + * some architectures (notably Intel 80x86) will not deliver the interrupt + * until the *next* floating point operation. This is painful if you've + * already decremented PyFPE_counter. + */ +#define PyFPE_END_PROTECT(v) PyFPE_counter -= (int)PyFPE_dummy(&(v)); + +#else + +#define PyFPE_START_PROTECT(err_string, leave_stmt) +#define PyFPE_END_PROTECT(v) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYFPE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pygetopt.h b/flaskwebproject/FlaskWebProject1/Include/pygetopt.h new file mode 100644 index 0000000..962720c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pygetopt.h @@ -0,0 +1,21 @@ + +#ifndef Py_PYGETOPT_H +#define Py_PYGETOPT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(int) _PyOS_opterr; +PyAPI_DATA(int) _PyOS_optind; +PyAPI_DATA(wchar_t *) _PyOS_optarg; + +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); + +PyAPI_FUNC(int) _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYGETOPT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyhash.h b/flaskwebproject/FlaskWebProject1/Include/pyhash.h new file mode 100644 index 0000000..9cfd071 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyhash.h @@ -0,0 +1,145 @@ +#ifndef Py_HASH_H + +#define Py_HASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Helpers for hash functions */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); +#endif + +/* Prime multiplier used in string and various other hashes. */ +#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ + +/* Parameters used for the numeric hash implementation. See notes for + _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on + reduction modulo the prime 2**_PyHASH_BITS - 1. */ + +#if SIZEOF_VOID_P >= 8 +# define _PyHASH_BITS 61 +#else +# define _PyHASH_BITS 31 +#endif + +#define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) +#define _PyHASH_INF 314159 +#define _PyHASH_NAN 0 +#define _PyHASH_IMAG _PyHASH_MULTIPLIER + + +/* hash secret + * + * memory layout on 64 bit systems + * cccccccc cccccccc cccccccc uc -- unsigned char[24] + * pppppppp ssssssss ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t + * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeeeeeee pyexpat XML hash salt + * + * memory layout on 32 bit systems + * cccccccc cccccccc cccccccc uc + * ppppssss ........ ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) + * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeee.... pyexpat XML hash salt + * + * (*) The siphash member may not be available on 32 bit platforms without + * an unsigned int64 data type. + */ +#ifndef Py_LIMITED_API +typedef union { + /* ensure 24 bytes */ + unsigned char uc[24]; + /* two Py_hash_t for FNV */ + struct { + Py_hash_t prefix; + Py_hash_t suffix; + } fnv; + /* two uint64 for SipHash24 */ + struct { + uint64_t k0; + uint64_t k1; + } siphash; + /* a different (!) Py_hash_t for small string optimization */ + struct { + unsigned char padding[16]; + Py_hash_t suffix; + } djbx33a; + struct { + unsigned char padding[16]; + Py_hash_t hashsalt; + } expat; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#endif + +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + + +/* hash function definition */ +#ifndef Py_LIMITED_API +typedef struct { + Py_hash_t (*const hash)(const void *, Py_ssize_t); + const char *name; + const int hash_bits; + const int seed_bits; +} PyHash_FuncDef; + +PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); +#endif + + +/* cutoff for small string DJBX33A optimization in range [1, cutoff). + * + * About 50% of the strings in a typical Python application are smaller than + * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks. + * NEVER use DJBX33A for long strings! + * + * A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms + * should use a smaller cutoff because it is easier to create colliding + * strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should + * provide a decent safety margin. + */ +#ifndef Py_HASH_CUTOFF +# define Py_HASH_CUTOFF 0 +#elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0) +# error Py_HASH_CUTOFF must in range 0...7. +#endif /* Py_HASH_CUTOFF */ + + +/* hash algorithm selection + * + * The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the + * configure script. + * + * - FNV is available on all platforms and architectures. + * - SIPHASH24 only works on plaforms that don't require aligned memory for integers. + * - With EXTERNAL embedders can provide an alternative implementation with:: + * + * PyHash_FuncDef PyHash_Func = {...}; + * + * XXX: Figure out __declspec() for extern PyHash_FuncDef. + */ +#define Py_HASH_EXTERNAL 0 +#define Py_HASH_SIPHASH24 1 +#define Py_HASH_FNV 2 + +#ifndef Py_HASH_ALGORITHM +# ifndef HAVE_ALIGNED_REQUIRED +# define Py_HASH_ALGORITHM Py_HASH_SIPHASH24 +# else +# define Py_HASH_ALGORITHM Py_HASH_FNV +# endif /* uint64_t && uint32_t && aligned */ +#endif /* Py_HASH_ALGORITHM */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_HASH_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pylifecycle.h b/flaskwebproject/FlaskWebProject1/Include/pylifecycle.h new file mode 100644 index 0000000..01abfa9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pylifecycle.h @@ -0,0 +1,129 @@ + +/* Interfaces to configure, query, create & destroy the Python runtime */ + +#ifndef Py_PYLIFECYCLE_H +#define Py_PYLIFECYCLE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) Py_SetProgramName(wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); + +PyAPI_FUNC(void) Py_SetPythonHome(wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); + +#ifndef Py_LIMITED_API +/* Only used by applications that embed the interpreter and need to + * override the standard encoding determination mechanism + */ +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, + const char *errors); +#endif + +PyAPI_FUNC(void) Py_Initialize(void); +PyAPI_FUNC(void) Py_InitializeEx(int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_InitializeEx_Private(int, int); +#endif +PyAPI_FUNC(void) Py_Finalize(void); +PyAPI_FUNC(int) Py_FinalizeEx(void); +PyAPI_FUNC(int) Py_IsInitialized(void); +PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); +PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); + + +/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level + * exit functions. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(void)); +#endif +PyAPI_FUNC(int) Py_AtExit(void (*func)(void)); + +PyAPI_FUNC(void) Py_Exit(int); + +/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_RestoreSignals(void); + +PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); +#endif + +/* Bootstrap __main__ (defined in Modules/main.c) */ +PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); + +/* In getpath.c */ +PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); +PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetPath(void); +PyAPI_FUNC(void) Py_SetPath(const wchar_t *); +#ifdef MS_WINDOWS +int _Py_CheckPython3(); +#endif + +/* In their own files */ +PyAPI_FUNC(const char *) Py_GetVersion(void); +PyAPI_FUNC(const char *) Py_GetPlatform(void); +PyAPI_FUNC(const char *) Py_GetCopyright(void); +PyAPI_FUNC(const char *) Py_GetCompiler(void); +PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _Py_gitidentifier(void); +PyAPI_FUNC(const char *) _Py_gitversion(void); +#endif + +/* Internal -- various one-time initializations */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(PyObject *) _PySys_Init(void); +PyAPI_FUNC(void) _PyImport_Init(void); +PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod); +PyAPI_FUNC(void) _PyImportHooks_Init(void); +PyAPI_FUNC(int) _PyFrame_Init(void); +PyAPI_FUNC(int) _PyFloat_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); +#endif + +/* Various internal finalizers */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyExc_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini(void); +PyAPI_FUNC(void) PyMethod_Fini(void); +PyAPI_FUNC(void) PyFrame_Fini(void); +PyAPI_FUNC(void) PyCFunction_Fini(void); +PyAPI_FUNC(void) PyDict_Fini(void); +PyAPI_FUNC(void) PyTuple_Fini(void); +PyAPI_FUNC(void) PyList_Fini(void); +PyAPI_FUNC(void) PySet_Fini(void); +PyAPI_FUNC(void) PyBytes_Fini(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); +PyAPI_FUNC(void) PyFloat_Fini(void); +PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); +PyAPI_FUNC(void) _PyGC_Fini(void); +PyAPI_FUNC(void) PySlice_Fini(void); +PyAPI_FUNC(void) _PyType_Fini(void); +PyAPI_FUNC(void) _PyRandom_Fini(void); +PyAPI_FUNC(void) PyAsyncGen_Fini(void); + +PyAPI_DATA(PyThreadState *) _Py_Finalizing; +#endif + +/* Signals */ +typedef void (*PyOS_sighandler_t)(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); + +#ifndef Py_LIMITED_API +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); +PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYLIFECYCLE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pymacconfig.h b/flaskwebproject/FlaskWebProject1/Include/pymacconfig.h new file mode 100644 index 0000000..9dde11b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pymacconfig.h @@ -0,0 +1,102 @@ +#ifndef PYMACCONFIG_H +#define PYMACCONFIG_H + /* + * This file moves some of the autoconf magic to compile-time + * when building on MacOSX. This is needed for building 4-way + * universal binaries and for 64-bit universal binaries because + * the values redefined below aren't configure-time constant but + * only compile-time constant in these scenarios. + */ + +#if defined(__APPLE__) + +# undef SIZEOF_LONG +# undef SIZEOF_PTHREAD_T +# undef SIZEOF_SIZE_T +# undef SIZEOF_TIME_T +# undef SIZEOF_VOID_P +# undef SIZEOF__BOOL +# undef SIZEOF_UINTPTR_T +# undef SIZEOF_PTHREAD_T +# undef WORDS_BIGENDIAN +# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +# undef HAVE_GCC_ASM_FOR_X87 + +# undef VA_LIST_IS_ARRAY +# if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +# endif + +# undef HAVE_LARGEFILE_SUPPORT +# ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +# endif + +# undef SIZEOF_LONG +# ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +# else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +# endif + +# if defined(__LP64__) + /* MacOSX 10.4 (the first release to support 64-bit code + * at all) only supports 64-bit in the UNIX layer. + * Therefore suppress the toolbox-glue in 64-bit mode. + */ + + /* In 64-bit mode setpgrp always has no arguments, in 32-bit + * mode that depends on the compilation environment + */ +# undef SETPGRP_HAVE_ARG + +# endif + +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +#else +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#endif /* __BIG_ENDIAN */ + +#ifdef __i386__ +# define HAVE_GCC_ASM_FOR_X87 +#endif + + /* + * The definition in pyconfig.h is only valid on the OS release + * where configure ran on and not necessarily for all systems where + * the executable can be used on. + * + * Specifically: OSX 10.4 has limited supported for '%zd', while + * 10.5 has full support for '%zd'. A binary built on 10.5 won't + * work properly on 10.4 unless we suppress the definition + * of PY_FORMAT_SIZE_T + */ +#undef PY_FORMAT_SIZE_T + + +#endif /* defined(_APPLE__) */ + +#endif /* PYMACCONFIG_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pymacro.h b/flaskwebproject/FlaskWebProject1/Include/pymacro.h new file mode 100644 index 0000000..2a839ab --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pymacro.h @@ -0,0 +1,98 @@ +#ifndef Py_PYMACRO_H +#define Py_PYMACRO_H + +/* Minimum value between x and y */ +#define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +/* Maximum value between x and y */ +#define Py_MAX(x, y) (((x) > (y)) ? (x) : (y)) + +/* Absolute value of the number x */ +#define Py_ABS(x) ((x) < 0 ? -(x) : (x)) + +#define _Py_XSTRINGIFY(x) #x + +/* Convert the argument to a string. For example, Py_STRINGIFY(123) is replaced + with "123" by the preprocessor. Defines are also replaced by their value. + For example Py_STRINGIFY(__LINE__) is replaced by the line number, not + by "__LINE__". */ +#define Py_STRINGIFY(x) _Py_XSTRINGIFY(x) + +/* Get the size of a structure member in bytes */ +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + +/* Argument must be a char or an int in [-128, 127] or [0, 255]. */ +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) + +/* Assert a build-time dependency, as an expression. + + Your compile will fail if the condition isn't true, or can't be evaluated + by the compiler. This can be used in an expression: its value is 0. + + Example: + + #define foo_to_char(foo) \ + ((char *)(foo) \ + + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) + + Written by Rusty Russell, public domain, http://ccodearchive.net/ */ +#define Py_BUILD_ASSERT_EXPR(cond) \ + (sizeof(char [1 - 2*!(cond)]) - 1) + +#define Py_BUILD_ASSERT(cond) do { \ + (void)Py_BUILD_ASSERT_EXPR(cond); \ + } while(0) + +/* Get the number of elements in a visible array + + This does not work on pointers, or arrays declared as [], or function + parameters. With correct compiler support, such usage will cause a build + error (see Py_BUILD_ASSERT_EXPR). + + Written by Rusty Russell, public domain, http://ccodearchive.net/ + + Requires at GCC 3.1+ */ +#if (defined(__GNUC__) && !defined(__STRICT_ANSI__) && \ + (((__GNUC__ == 3) && (__GNU_MINOR__ >= 1)) || (__GNUC__ >= 4))) +/* Two gcc extensions. + &a[0] degrades to a pointer: a different type from an array */ +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0]) \ + + Py_BUILD_ASSERT_EXPR(!__builtin_types_compatible_p(typeof(array), \ + typeof(&(array)[0])))) +#else +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0])) +#endif + + +/* Define macros for inline documentation. */ +#define PyDoc_VAR(name) static char name[] +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif + +/* Below "a" is a power of 2. */ +/* Round down size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_DOWN(n, a) ((size_t)(n) & ~(size_t)((a) - 1)) +/* Round up size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \ + (size_t)((a) - 1)) & ~(size_t)((a) - 1)) +/* Round pointer "p" down to the closest "a"-aligned address <= "p". */ +#define _Py_ALIGN_DOWN(p, a) ((void *)((uintptr_t)(p) & ~(uintptr_t)((a) - 1))) +/* Round pointer "p" up to the closest "a"-aligned address >= "p". */ +#define _Py_ALIGN_UP(p, a) ((void *)(((uintptr_t)(p) + \ + (uintptr_t)((a) - 1)) & ~(uintptr_t)((a) - 1))) +/* Check if pointer "p" is aligned to "a"-bytes boundary. */ +#define _Py_IS_ALIGNED(p, a) (!((uintptr_t)(p) & (uintptr_t)((a) - 1))) + +#ifdef __GNUC__ +#define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) +#else +#define Py_UNUSED(name) _unused_ ## name +#endif + +#endif /* Py_PYMACRO_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pymath.h b/flaskwebproject/FlaskWebProject1/Include/pymath.h new file mode 100644 index 0000000..6cf69f9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pymath.h @@ -0,0 +1,230 @@ +#ifndef Py_PYMATH_H +#define Py_PYMATH_H + +#include "pyconfig.h" /* include for defines */ + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to mathematical +functions and constants +**************************************************************************/ + +/* Python provides implementations for copysign, round and hypot in + * Python/pymath.c just in case your math library doesn't provide the + * functions. + * + *Note: PC/pyconfig.h defines copysign as _copysign + */ +#ifndef HAVE_COPYSIGN +extern double copysign(double, double); +#endif + +#ifndef HAVE_ROUND +extern double round(double); +#endif + +#ifndef HAVE_HYPOT +extern double hypot(double, double); +#endif + +/* extra declarations */ +#ifndef _MSC_VER +#ifndef __STDC__ +extern double fmod (double, double); +extern double frexp (double, int *); +extern double ldexp (double, int); +extern double modf (double, double *); +extern double pow(double, double); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + +/* High precision definition of pi and e (Euler) + * The values are taken from libc6's math.h. + */ +#ifndef Py_MATH_PIl +#define Py_MATH_PIl 3.1415926535897932384626433832795029L +#endif +#ifndef Py_MATH_PI +#define Py_MATH_PI 3.14159265358979323846 +#endif + +#ifndef Py_MATH_El +#define Py_MATH_El 2.7182818284590452353602874713526625L +#endif + +#ifndef Py_MATH_E +#define Py_MATH_E 2.7182818284590452354 +#endif + +/* Tau (2pi) to 40 digits, taken from tauday.com/tau-digits. */ +#ifndef Py_MATH_TAU +#define Py_MATH_TAU 6.2831853071795864769252867665590057683943L +#endif + + +/* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU + register and into a 64-bit memory location, rounding from extended + precision to double precision in the process. On other platforms it does + nothing. */ + +/* we take double rounding as evidence of x87 usage */ +#ifndef Py_LIMITED_API +#ifndef Py_FORCE_DOUBLE +# ifdef X87_DOUBLE_ROUNDING +PyAPI_FUNC(double) _Py_force_double(double); +# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +# else +# define Py_FORCE_DOUBLE(X) (X) +# endif +#endif +#endif + +#ifndef Py_LIMITED_API +#ifdef HAVE_GCC_ASM_FOR_X87 +PyAPI_FUNC(unsigned short) _Py_get_387controlword(void); +PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); +#endif +#endif + +/* Py_IS_NAN(X) + * Return 1 if float or double arg is a NaN, else 0. + * Caution: + * X is evaluated more than once. + * This may not work on all platforms. Each platform has *some* + * way to spell this, though -- override in pyconfig.h if you have + * a platform where it doesn't work. + * Note: PC/pyconfig.h defines Py_IS_NAN as _isnan + */ +#ifndef Py_IS_NAN +#if defined HAVE_DECL_ISNAN && HAVE_DECL_ISNAN == 1 +#define Py_IS_NAN(X) isnan(X) +#else +#define Py_IS_NAN(X) ((X) != (X)) +#endif +#endif + +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + * Override in pyconfig.h if you have a better spelling on your platform. + * Py_FORCE_DOUBLE is used to avoid getting false negatives from a + * non-infinite value v sitting in an 80-bit x87 register such that + * v becomes infinite when spilled from the register to 64-bit memory. + * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + */ +#ifndef Py_IS_INFINITY +# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +# define Py_IS_INFINITY(X) isinf(X) +# else +# define Py_IS_INFINITY(X) ((X) && \ + (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) +# endif +#endif + +/* Py_IS_FINITE(X) + * Return 1 if float or double arg is neither infinite nor NAN, else 0. + * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * macro for this particular test is useful + * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite + */ +#ifndef Py_IS_FINITE +#if defined HAVE_DECL_ISFINITE && HAVE_DECL_ISFINITE == 1 +#define Py_IS_FINITE(X) isfinite(X) +#elif defined HAVE_FINITE +#define Py_IS_FINITE(X) finite(X) +#else +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif +#endif + +/* HUGE_VAL is supposed to expand to a positive double infinity. Python + * uses Py_HUGE_VAL instead because some platforms are broken in this + * respect. We used to embed code in pyport.h to try to worm around that, + * but different platforms are broken in conflicting ways. If you're on + * a platform where HUGE_VAL is defined incorrectly, fiddle your Python + * config to #define Py_HUGE_VAL to something that works on your platform. + */ +#ifndef Py_HUGE_VAL +#define Py_HUGE_VAL HUGE_VAL +#endif + +/* Py_NAN + * A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or + * INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform + * doesn't support NaNs. + */ +#if !defined(Py_NAN) && !defined(Py_NO_NAN) +#if !defined(__INTEL_COMPILER) + #define Py_NAN (Py_HUGE_VAL * 0.) +#else /* __INTEL_COMPILER */ + #if defined(ICC_NAN_STRICT) + #pragma float_control(push) + #pragma float_control(precise, on) + #pragma float_control(except, on) + #if defined(_MSC_VER) + __declspec(noinline) + #else /* Linux */ + __attribute__((noinline)) + #endif /* _MSC_VER */ + static double __icc_nan() + { + return sqrt(-1.0); + } + #pragma float_control (pop) + #define Py_NAN __icc_nan() + #else /* ICC_NAN_RELAXED as default for Intel Compiler */ + static const union { unsigned char buf[8]; double __icc_nan; } __nan_store = {0,0,0,0,0,0,0xf8,0x7f}; + #define Py_NAN (__nan_store.__icc_nan) + #endif /* ICC_NAN_STRICT */ +#endif /* __INTEL_COMPILER */ +#endif + +/* Py_OVERFLOWED(X) + * Return 1 iff a libm function overflowed. Set errno to 0 before calling + * a libm function, and invoke this macro after, passing the function + * result. + * Caution: + * This isn't reliable. C99 no longer requires libm to set errno under + * any exceptional condition, but does require +- HUGE_VAL return + * values on overflow. A 754 box *probably* maps HUGE_VAL to a + * double infinity, and we're cool if that's so, unless the input + * was an infinity and an infinity is the expected result. A C89 + * system sets errno to ERANGE, so we check for that too. We're + * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or + * if the returned result is a NaN, or if a C89 box returns HUGE_VAL + * in non-overflow cases. + * X is evaluated more than once. + * Some platforms have better way to spell this, so expect some #ifdef'ery. + * + * OpenBSD uses 'isinf()' because a compiler bug on that platform causes + * the longer macro version to be mis-compiled. This isn't optimal, and + * should be removed once a newer compiler is available on that platform. + * The system that had the failure was running OpenBSD 3.2 on Intel, with + * gcc 2.95.3. + * + * According to Tim's checkin, the FreeBSD systems use isinf() to work + * around a FPE bug on that platform. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define Py_OVERFLOWED(X) isinf(X) +#else +#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ + (X) == Py_HUGE_VAL || \ + (X) == -Py_HUGE_VAL)) +#endif + +/* Return whether integral type *type* is signed or not. */ +#define _Py_IntegralTypeSigned(type) ((type)(-1) < 0) +/* Return the maximum value of integral type *type*. */ +#define _Py_IntegralTypeMax(type) ((_Py_IntegralTypeSigned(type)) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) +/* Return the minimum value of integral type *type*. */ +#define _Py_IntegralTypeMin(type) ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) +/* Check whether *v* is in the range of integral type *type*. This is most + * useful if *v* is floating-point, since demoting a floating-point *v* to an + * integral type that cannot represent *v*'s integral part is undefined + * behavior. */ +#define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) + +#endif /* Py_PYMATH_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pymem.h b/flaskwebproject/FlaskWebProject1/Include/pymem.h new file mode 100644 index 0000000..a7eb4d2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pymem.h @@ -0,0 +1,233 @@ +/* The PyMem_ family: low-level memory allocation interfaces. + See objimpl.h for the PyObject_ memory family. +*/ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); +PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); +PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_RawFree(void *ptr); + +/* Configure the Python memory allocators. Pass NULL to use default + allocators. */ +PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); + +#ifdef WITH_PYMALLOC +PyAPI_FUNC(int) _PyMem_PymallocEnabled(void); +#endif + +/* Identifier of an address space (domain) in tracemalloc */ +typedef unsigned int _PyTraceMalloc_domain_t; + +/* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). + + Return -2 if tracemalloc is disabled. + + If memory block is already tracked, update the existing trace. */ +PyAPI_FUNC(int) _PyTraceMalloc_Track( + _PyTraceMalloc_domain_t domain, + uintptr_t ptr, + size_t size); + +/* Untrack an allocated memory block in the tracemalloc module. + Do nothing if the block was not tracked. + + Return -2 if tracemalloc is disabled, otherwise return 0. */ +PyAPI_FUNC(int) _PyTraceMalloc_Untrack( + _PyTraceMalloc_domain_t domain, + uintptr_t ptr); + +/* Get the traceback where a memory block was allocated. + + Return a tuple of (filename: str, lineno: int) tuples. + + Return None if the tracemalloc module is disabled or if the memory block + is not tracked by tracemalloc. + + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( + _PyTraceMalloc_domain_t domain, + uintptr_t ptr); +#endif /* !Py_LIMITED_API */ + + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyMem_ with calls to the platform malloc/realloc/ + calloc/free. For example, on Windows different DLLs may end up using + different heaps, and if you use PyMem_Malloc you'll get the memory from the + heap used by the Python DLL; it could be a disaster if you free()'ed that + directly in your own extension. Using PyMem_Free instead ensures Python + can return the memory to the proper heap. As another example, in + PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ + memory functions in special debugging wrappers that add additional + debugging info to dynamic memory blocks. The system routines have no idea + what to do with that stuff, and the Python wrappers have no idea what to do + with raw blocks obtained directly by the system routines then. + + The GIL must be held when using these APIs. +*/ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions + + Functions supplying platform-independent semantics for malloc/realloc/ + free. These functions make sure that allocating 0 bytes returns a distinct + non-NULL pointer (whenever possible -- if we're flat out of memory, NULL + may be returned), even if the platform malloc and realloc don't. + Returned pointers must be checked for NULL explicitly. No action is + performed on failure (no exception is set, no warning is printed, etc). +*/ + +PyAPI_FUNC(void *) PyMem_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_Free(void *ptr); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); +PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); +#endif + +/* Macros. */ + +/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) PyMem_Malloc(n) +#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) +#define PyMem_FREE(p) PyMem_Free(p) + +/* + * Type-oriented memory interface + * ============================== + * + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. + */ + +#define PyMem_New(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) +#define PyMem_NEW(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) + +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ +#define PyMem_Resize(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + +/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used + * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. + */ +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_FREE + +#ifndef Py_LIMITED_API +typedef enum { + /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ + PYMEM_DOMAIN_RAW, + + /* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */ + PYMEM_DOMAIN_MEM, + + /* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */ + PYMEM_DOMAIN_OBJ +} PyMemAllocatorDomain; + +typedef struct { + /* user context passed as the first argument to the 4 functions */ + void *ctx; + + /* allocate a memory block */ + void* (*malloc) (void *ctx, size_t size); + + /* allocate a memory block initialized by zeros */ + void* (*calloc) (void *ctx, size_t nelem, size_t elsize); + + /* allocate or resize a memory block */ + void* (*realloc) (void *ctx, void *ptr, size_t new_size); + + /* release a memory block */ + void (*free) (void *ctx, void *ptr); +} PyMemAllocatorEx; + +/* Get the memory block allocator of the specified domain. */ +PyAPI_FUNC(void) PyMem_GetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Set the memory block allocator of the specified domain. + + The new allocator must return a distinct non-NULL pointer when requesting + zero bytes. + + For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL + is not held when the allocator is called. + + If the new allocator is not a hook (don't call the previous allocator), the + PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks + on top on the new allocator. */ +PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Setup hooks to detect bugs in the following Python memory allocator + functions: + + - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree() + - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free() + - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() + + Newly allocated memory is filled with the byte 0xCB, freed memory is filled + with the byte 0xDB. Additionnal checks: + + - detect API violations, ex: PyObject_Free() called on a buffer allocated + by PyMem_Malloc() + - detect write before the start of the buffer (buffer underflow) + - detect write after the end of the buffer (buffer overflow) + + The function does nothing if Python is not compiled is debug mode. */ +PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYMEM_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pyport.h b/flaskwebproject/FlaskWebProject1/Include/pyport.h new file mode 100644 index 0000000..426822a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pyport.h @@ -0,0 +1,767 @@ +#ifndef Py_PYPORT_H +#define Py_PYPORT_H + +#include "pyconfig.h" /* include for defines */ + +#include + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to basic +C language & library operations whose spellings vary across platforms. + +Please try to make documentation here as clear as possible: by definition, +the stuff here is trying to illuminate C's darkest corners. + +Config #defines referenced here: + +SIGNED_RIGHT_SHIFT_ZERO_FILLS +Meaning: To be defined iff i>>j does not extend the sign bit when i is a + signed integral type and i < 0. +Used in: Py_ARITHMETIC_RIGHT_SHIFT + +Py_DEBUG +Meaning: Extra checks compiled in for debug mode. +Used in: Py_SAFE_DOWNCAST + +**************************************************************************/ + +/* typedefs for some C9X-defined synonyms for integral types. + * + * The names in Python are exactly the same as the C9X names, except with a + * Py_ prefix. Until C9X is universally implemented, this is the only way + * to ensure that Python gets reliable names that don't conflict with names + * in non-Python code that are playing their own tricks to define the C9X + * names. + * + * NOTE: don't go nuts here! Python has no use for *most* of the C9X + * integral synonyms. Only define the ones we actually need. + */ + +/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */ +#ifndef HAVE_LONG_LONG +#define HAVE_LONG_LONG 1 +#endif +#ifndef PY_LONG_LONG +#define PY_LONG_LONG long long +/* If LLONG_MAX is defined in limits.h, use that. */ +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif + +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t + +/* Signed variants of the above */ +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all + the necessary integer types are available, and we're on a 64-bit platform + (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ + +#ifndef PYLONG_BITS_IN_DIGIT +#if SIZEOF_VOID_P >= 8 +#define PYLONG_BITS_IN_DIGIT 30 +#else +#define PYLONG_BITS_IN_DIGIT 15 +#endif +#endif + +/* uintptr_t is the C9X name for an unsigned integral type such that a + * legitimate void* can be cast to uintptr_t and then back to void* again + * without loss of information. Similarly for intptr_t, wrt a signed + * integral type. + */ +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; + +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_intptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif + +/* Py_hash_t is the same size as a pointer. */ +#define SIZEOF_PY_HASH_T SIZEOF_SIZE_T +typedef Py_ssize_t Py_hash_t; +/* Py_uhash_t is the unsigned equivalent needed to calculate numeric hash. */ +#define SIZEOF_PY_UHASH_T SIZEOF_SIZE_T +typedef size_t Py_uhash_t; + +/* Only used for compatibility with code that may not be PY_SSIZE_T_CLEAN. */ +#ifdef PY_SSIZE_T_CLEAN +typedef Py_ssize_t Py_ssize_clean_t; +#else +typedef int Py_ssize_clean_t; +#endif + +/* Largest possible value of size_t. */ +#define PY_SIZE_MAX SIZE_MAX + +/* Largest positive value of type Py_ssize_t. */ +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyBytes_FromFormat + * PyErr_Format + * PyBytes_FromFormatV + * PyUnicode_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +# define PY_FORMAT_SIZE_T "" +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + +/* Py_LOCAL can be used instead of static to get the fastest possible calling + * convention for functions that are local to a given module. + * + * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, + * for platforms that support that. + * + * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more + * "aggressive" inlining/optimization is enabled for the entire module. This + * may lead to code bloat, and may slow things down for those reasons. It may + * also lead to errors, if the code relies on pointer aliasing. Use with + * care. + * + * NOTE: You can only use this for functions that are entirely local to a + * module; functions that are exported via method tables, callbacks, etc, + * should keep using static. + */ + +#if defined(_MSC_VER) +#if defined(PY_LOCAL_AGGRESSIVE) +/* enable more aggressive optimization for visual studio */ +#pragma optimize("agtw", on) +#endif +/* ignore warnings if the compiler decides not to inline a function */ +#pragma warning(disable: 4710) +/* fastest possible local call under MSVC */ +#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL_INLINE(type) static __inline type __fastcall +#elif defined(USE_INLINE) +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static inline type +#else +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static type +#endif + +/* Py_MEMCPY is kept for backwards compatibility, + * see https://bugs.python.org/issue28126 */ +#define Py_MEMCPY memcpy + +#include + +#ifdef HAVE_IEEEFP_H +#include /* needed for 'finite' declaration on some platforms */ +#endif + +#include /* Moved here from the math section, before extern "C" */ + +/******************************************** + * WRAPPER FOR and/or * + ********************************************/ + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else /* !TIME_WITH_SYS_TIME */ +#ifdef HAVE_SYS_TIME_H +#include +#else /* !HAVE_SYS_TIME_H */ +#include +#endif /* !HAVE_SYS_TIME_H */ +#endif /* !TIME_WITH_SYS_TIME */ + + +/****************************** + * WRAPPER FOR * + ******************************/ + +/* NB caller must include */ + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* !HAVE_SYS_SELECT_H */ + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +#ifdef HAVE_SYS_STAT_H +#include +#elif defined(HAVE_STAT_H) +#include +#endif + +#ifndef S_IFMT +/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ +#define S_IFMT 0170000 +#endif + +#ifndef S_IFLNK +/* Windows doesn't define S_IFLNK but posixmodule.c maps + * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ +# define S_IFLNK 0120000 +#endif + +#ifndef S_ISREG +#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISCHR +#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) +#endif + +#ifdef __cplusplus +/* Move this down here since some C++ #include's don't like to be included + inside an extern "C" */ +extern "C" { +#endif + + +/* Py_ARITHMETIC_RIGHT_SHIFT + * C doesn't define whether a right-shift of a signed integer sign-extends + * or zero-fills. Here a macro to force sign extension: + * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) + * Return I >> J, forcing sign extension. Arithmetically, return the + * floor of I/2**J. + * Requirements: + * I should have signed integer type. In the terminology of C99, this can + * be either one of the five standard signed integer types (signed char, + * short, int, long, long long) or an extended signed integer type. + * J is an integer >= 0 and strictly less than the number of bits in the + * type of I (because C doesn't define what happens for J outside that + * range either). + * TYPE used to specify the type of I, but is now ignored. It's been left + * in for backwards compatibility with versions <= 2.6 or 3.0. + * Caution: + * I may be evaluated more than once. + */ +#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ + ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) +#else +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) +#endif + +/* Py_FORCE_EXPANSION(X) + * "Simply" returns its argument. However, macro expansions within the + * argument are evaluated. This unfortunate trickery is needed to get + * token-pasting to work as desired in some cases. + */ +#define Py_FORCE_EXPANSION(X) X + +/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) + * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this + * assert-fails if any information is lost. + * Caution: + * VALUE may be evaluated more than once. + */ +#ifdef Py_DEBUG +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) +#else +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) +#endif + +/* Py_SET_ERRNO_ON_MATH_ERROR(x) + * If a libm function did not set errno, but it looks like the result + * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno + * to 0 before calling a libm function, and invoke this macro after, + * passing the function result. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X is evaluated more than once. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#else +#define _Py_SET_EDOM_FOR_NAN(X) ; +#endif +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while(0) + +/* Py_SET_ERANGE_ON_OVERFLOW(x) + * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. + */ +#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) + +/* Py_ADJUST_ERANGE1(x) + * Py_ADJUST_ERANGE2(x, y) + * Set errno to 0 before calling a libm function, and invoke one of these + * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful + * for functions returning complex results). This makes two kinds of + * adjustments to errno: (A) If it looks like the platform libm set + * errno=ERANGE due to underflow, clear errno. (B) If it looks like the + * platform libm overflowed but didn't set errno, force errno to ERANGE. In + * effect, we're trying to force a useful implementation of C89 errno + * behavior. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X and Y may be evaluated more than once. + */ +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while(0) + +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ + (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE) \ + errno = 0; \ + } while(0) + +/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are + * required to support the short float repr introduced in Python 3.1) require + * that the floating-point unit that's being used for arithmetic operations + * on C doubles is set to use 53-bit precision. It also requires that the + * FPU rounding mode is round-half-to-even, but that's less often an issue. + * + * If your FPU isn't already set to 53-bit precision/round-half-to-even, and + * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should + * + * #define HAVE_PY_SET_53BIT_PRECISION 1 + * + * and also give appropriate definitions for the following three macros: + * + * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and + * set FPU to 53-bit precision/round-half-to-even + * _PY_SET_53BIT_PRECISION_END : restore original FPU settings + * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to + * use the two macros above. + * + * The macros are designed to be used within a single C function: see + * Python/pystrtod.c for an example of their use. + */ + +/* get and set x87 control word for gcc/x86 */ +#ifdef HAVE_GCC_ASM_FOR_X87 +#define HAVE_PY_SET_53BIT_PRECISION 1 +/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) +#endif + +/* get and set x87 control word for VisualStudio/x86 */ +#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_387controlword, new_387controlword, out_387controlword +/* We use the __control87_2 function to set only the x87 control word. + The SSE control word is unaffected. */ +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __control87_2(0, 0, &old_387controlword, NULL); \ + new_387controlword = \ + (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ + if (new_387controlword != old_387controlword) \ + __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_387controlword != old_387controlword) \ + __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#endif + +#ifdef HAVE_GCC_ASM_FOR_MC68881 +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_fpcr, new_fpcr +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \ + /* Set double precision / round to nearest. */ \ + new_fpcr = (old_fpcr & ~0xf0) | 0x80; \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr)); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \ + } while (0) +#endif + +/* default definitions are empty */ +#ifndef HAVE_PY_SET_53BIT_PRECISION +#define _Py_SET_53BIT_PRECISION_HEADER +#define _Py_SET_53BIT_PRECISION_START +#define _Py_SET_53BIT_PRECISION_END +#endif + +/* If we can't guarantee 53-bit precision, don't use the code + in Python/dtoa.c, but fall back to standard code. This + means that repr of a float will be long (17 sig digits). + + Realistically, there are two things that could go wrong: + + (1) doubles aren't IEEE 754 doubles, or + (2) we're on x86 with the rounding precision set to 64-bits + (extended precision), and we don't know how to change + the rounding precision. + */ + +#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* double rounding is symptomatic of use of extended precision on x86. If + we're seeing double rounding, and we don't have any mechanism available for + changing the FPU rounding precision, then don't use Python/dtoa.c. */ +#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) +#define PY_NO_SHORT_FLOAT_REPR +#endif + + +/* Py_DEPRECATED(version) + * Declare a variable, type, or function deprecated. + * Usage: + * extern int old_var Py_DEPRECATED(2.3); + * typedef int T1 Py_DEPRECATED(2.4); + * extern int x() Py_DEPRECATED(2.5); + */ +#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ + (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#else +#define Py_DEPRECATED(VERSION_UNUSED) +#endif + +/************************************************************************** +Prototypes that are missing from the standard include files on some systems +(and possibly only some versions of such systems.) + +Please be conservative with adding new ones, document them and enclose them +in platform-specific #ifdefs. +**************************************************************************/ + +#ifdef SOLARIS +/* Unchecked */ +extern int gethostname(char *, int); +#endif + +#ifdef HAVE__GETPTY +#include /* we need to import mode_t */ +extern char * _getpty(int *, int, mode_t, int); +#endif + +/* On QNX 6, struct termio must be declared by including sys/termio.h + if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must + be included before termios.h or it will generate an error. */ +#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) +#include +#endif + +#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) +#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) +/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' + functions, even though they are included in libutil. */ +#include +extern int openpty(int *, int *, char *, struct termios *, struct winsize *); +extern pid_t forkpty(int *, char *, struct termios *, struct winsize *); +#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ +#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ + + +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ + +#ifdef __FreeBSD__ +#include +#if (__FreeBSD_version >= 500040 && __FreeBSD_version < 602113) || \ + (__FreeBSD_version >= 700000 && __FreeBSD_version < 700054) || \ + (__FreeBSD_version >= 800000 && __FreeBSD_version < 800001) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif +#endif + + +#if defined(__APPLE__) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif + +#ifdef _PY_PORT_CTYPE_UTF8_ISSUE +#ifndef __cplusplus + /* The workaround below is unsafe in C++ because + * the defines these symbols as real functions, + * with a slightly different signature. + * See issue #10910 + */ +#include +#include +#undef isalnum +#define isalnum(c) iswalnum(btowc(c)) +#undef isalpha +#define isalpha(c) iswalpha(btowc(c)) +#undef islower +#define islower(c) iswlower(btowc(c)) +#undef isspace +#define isspace(c) iswspace(btowc(c)) +#undef isupper +#define isupper(c) iswupper(btowc(c)) +#undef tolower +#define tolower(c) towlower(btowc(c)) +#undef toupper +#define toupper(c) towupper(btowc(c)) +#endif +#endif + + +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + Cygwin is the only other autoconf platform requiring special + linkage handling and it uses __declspec(). +*/ +#if defined(__CYGWIN__) +# define HAVE_DECLSPEC_DLL +#endif + +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# ifdef Py_BUILD_CORE +# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE +# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC PyObject* +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC PyObject* +# endif /* __cplusplus */ +#endif + +/* limits.h constants that may be missing */ + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif + +#ifndef LONG_MAX +#if SIZEOF_LONG == 4 +#define LONG_MAX 0X7FFFFFFFL +#elif SIZEOF_LONG == 8 +#define LONG_MAX 0X7FFFFFFFFFFFFFFFL +#else +#error "could not set LONG_MAX in pyport.h" +#endif +#endif + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * SIZEOF_LONG) +#endif + +#if LONG_BIT != 8 * SIZEOF_LONG +/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent + * 32-bit platforms using gcc. We try to catch that here at compile-time + * rather than waiting for integer multiplication to trigger bogus + * overflows. + */ +#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." +#endif + +#ifdef __cplusplus +} +#endif + +/* + * Hide GCC attributes from compilers that don't support them. + */ +#if (!defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) +#define Py_GCC_ATTRIBUTE(x) +#else +#define Py_GCC_ATTRIBUTE(x) __attribute__(x) +#endif + +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + +#ifndef Py_LL +#define Py_LL(x) x##LL +#endif + +#ifndef Py_ULL +#define Py_ULL(x) Py_LL(x##U) +#endif + +#define Py_VA_COPY va_copy + +/* + * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is + * detected by configure and defined in pyconfig.h. The code in pyconfig.h + * also takes care of Apple's universal builds. + */ + +#ifdef WORDS_BIGENDIAN +#define PY_BIG_ENDIAN 1 +#define PY_LITTLE_ENDIAN 0 +#else +#define PY_BIG_ENDIAN 0 +#define PY_LITTLE_ENDIAN 1 +#endif + +#ifdef Py_BUILD_CORE +/* + * Macros to protect CRT calls against instant termination when passed an + * invalid parameter (issue23524). + */ +#if defined _MSC_VER && _MSC_VER >= 1900 + +extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; +#define _Py_BEGIN_SUPPRESS_IPH { _invalid_parameter_handler _Py_old_handler = \ + _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); +#define _Py_END_SUPPRESS_IPH _set_thread_local_invalid_parameter_handler(_Py_old_handler); } + +#else + +#define _Py_BEGIN_SUPPRESS_IPH +#define _Py_END_SUPPRESS_IPH + +#endif /* _MSC_VER >= 1900 */ +#endif /* Py_BUILD_CORE */ + +#ifdef __ANDROID__ +#include +#endif + +#endif /* Py_PYPORT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pystate.h b/flaskwebproject/FlaskWebProject1/Include/pystate.h new file mode 100644 index 0000000..1838fa4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pystate.h @@ -0,0 +1,324 @@ + +/* Thread and interpreter state structures and their interfaces */ + + +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This limitation is for performance and simplicity. If needed it can be +removed (with effort). */ +#define MAX_CO_EXTRA_USERS 255 + +/* State shared between threads */ + +struct _ts; /* Forward */ +struct _is; /* Forward */ +struct _frame; /* Forward declaration for PyFrameObject. */ + +#ifdef Py_LIMITED_API +typedef struct _is PyInterpreterState; +#else +typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); + +typedef struct _is { + + struct _is *next; + struct _ts *tstate_head; + + PyObject *modules; + PyObject *modules_by_index; + PyObject *sysdict; + PyObject *builtins; + PyObject *importlib; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + int codecs_initialized; + int fscodec_initialized; + +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif + + PyObject *builtins_copy; + PyObject *import_func; + /* Initialized to PyEval_EvalFrameDefault(). */ + _PyFrameEvalFunction eval_frame; +} PyInterpreterState; +#endif + +typedef struct _co_extra_state { + struct _co_extra_state *next; + PyInterpreterState* interp; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; +} __PyCodeExtraState; + +/* This is temporary for backwards compat in 3.6 and will be removed in 3.7 */ +__PyCodeExtraState* __PyCodeExtraState_Get(void); + +/* State unique per thread */ + +#ifndef Py_LIMITED_API +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions: */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 +#endif + +#ifdef Py_LIMITED_API +typedef struct _ts PyThreadState; +#else +typedef struct _ts { + /* See Python/ceval.c for comments explaining most fields */ + + struct _ts *prev; + struct _ts *next; + PyInterpreterState *interp; + + struct _frame *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + long thread_id; /* Thread id where this tstate was created */ + + int trash_delete_nesting; + PyObject *trash_delete_later; + + /* Called when a thread state is deleted normally, but not when it + * is destroyed after fork(). + * Pain: to prevent rare but fatal shutdown errors (issue 18808), + * Thread.join() must wait for the join'ed thread's tstate to be unlinked + * from the tstate chain. That happens at the end of a thread's life, + * in pystate.c. + * The obvious way doesn't quite work: create a lock which the tstate + * unlinking code releases, and have Thread.join() wait to acquire that + * lock. The problem is that we _are_ at the end of the thread's life: + * if the thread holds the last reference to the lock, decref'ing the + * lock will delete the lock, and that may trigger arbitrary Python code + * if there's a weakref, with a callback, to the lock. But by this time + * _PyThreadState_Current is already NULL, so only the simplest of C code + * can be allowed to run (in particular it must not be possible to + * release the GIL). + * So instead of holding the lock directly, the tstate holds a weakref to + * the lock: that's the value of on_delete_data below. Decref'ing a + * weakref is harmless. + * on_delete points to _threadmodule.c's static release_sentinel() function. + * After the tstate is unlinked, release_sentinel is called with the + * weakref-to-lock (on_delete_data) argument, and release_sentinel releases + * the indirectly held lock. + */ + void (*on_delete)(void *); + void *on_delete_data; + + PyObject *coroutine_wrapper; + int in_coroutine_wrapper; + + /* Now used from PyInterpreterState, kept here for ABI + compatibility with PyThreadState */ + Py_ssize_t _preserve_36_ABI_1; + freefunc _preserve_36_ABI_2[MAX_CO_EXTRA_USERS]; + + PyObject *async_gen_firstiter; + PyObject *async_gen_finalizer; + + /* XXX signal handlers should also be here */ + +} PyThreadState; +#endif + + +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); +PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); +PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); +#endif /* !Py_LIMITED_API */ +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* New in 3.3 */ +PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*); +PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*); +#endif +PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyState_ClearModules(void); +#endif + +PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +#endif /* !Py_LIMITED_API */ +#ifdef WITH_THREAD +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyGILState_Reinit(void); +#endif /* !Py_LIMITED_API */ +#endif + +/* Return the current thread state. The global interpreter lock must be held. + * When the current thread state is NULL, this issues a fatal error (so that + * the caller needn't check for NULL). */ +PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); + +#ifndef Py_LIMITED_API +/* Similar to PyThreadState_Get(), but don't issue a fatal error + * if it is NULL. */ +PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); +PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); +PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *); + + +/* Variable and macro for in-line access to current thread state */ + +/* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ +#ifdef Py_BUILD_CORE +PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current; +# define PyThreadState_GET() \ + ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) +#else +# define PyThreadState_GET() PyThreadState_Get() +#endif + +typedef + enum {PyGILState_LOCKED, PyGILState_UNLOCKED} + PyGILState_STATE; + +#ifdef WITH_THREAD + +/* Ensure that the current thread is ready to call the Python + C API, regardless of the current state of Python, or of its + thread lock. This may be called as many times as desired + by a thread so long as each call is matched with a call to + PyGILState_Release(). In general, other thread-state APIs may + be used between _Ensure() and _Release() calls, so long as the + thread-state is restored to its previous state before the Release(). + For example, normal use of the Py_BEGIN_ALLOW_THREADS/ + Py_END_ALLOW_THREADS macros are acceptable. + + The return value is an opaque "handle" to the thread state when + PyGILState_Ensure() was called, and must be passed to + PyGILState_Release() to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles can *not* be shared - + each unique call to PyGILState_Ensure must save the handle for its + call to PyGILState_Release. + + When the function returns, the current thread will hold the GIL. + + Failure is a fatal error. +*/ +PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void); + +/* Release any resources previously acquired. After this call, Python's + state will be the same as it was prior to the corresponding + PyGILState_Ensure() call (but generally this state will be unknown to + the caller, hence the use of the GILState API.) + + Every call to PyGILState_Ensure must be matched by a call to + PyGILState_Release on the same thread. +*/ +PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE); + +/* Helper/diagnostic function - get the current thread state for + this thread. May return NULL if no GILState API has been used + on the current thread. Note that the main thread always has such a + thread-state, even if no auto-thread-state call has been made + on the main thread. +*/ +PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); + +#ifndef Py_LIMITED_API +/* Issue #26558: Flag to disable PyGILState_Check(). + If set to non-zero, PyGILState_Check() always return 1. */ +PyAPI_DATA(int) _PyGILState_check_enabled; + +/* Helper/diagnostic function - return 1 if the current thread + currently holds the GIL, 0 otherwise. + + The function returns 1 if _PyGILState_check_enabled is non-zero. */ +PyAPI_FUNC(int) PyGILState_Check(void); + +/* Unsafe function to get the single PyInterpreterState used by this process' + GILState implementation. + + Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini() + is called. */ +PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); +#endif + +#endif /* #ifdef WITH_THREAD */ + +/* The implementation of sys._current_frames() Returns a dict mapping + thread id to that thread's current frame. +*/ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +#endif + +/* Routines for advanced debuggers, requested by David Beazley. + Don't use unless you know what you are doing! */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); + +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); +#endif + +/* hook for PyEval_GetFrame(), requested for Psyco */ +#ifndef Py_LIMITED_API +PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pystrcmp.h b/flaskwebproject/FlaskWebProject1/Include/pystrcmp.h new file mode 100644 index 0000000..edb1239 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pystrcmp.h @@ -0,0 +1,23 @@ +#ifndef Py_STRCMP_H +#define Py_STRCMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); + +#ifdef MS_WINDOWS +#define PyOS_strnicmp strnicmp +#define PyOS_stricmp stricmp +#else +#define PyOS_strnicmp PyOS_mystrnicmp +#define PyOS_stricmp PyOS_mystricmp +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRCMP_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pystrhex.h b/flaskwebproject/FlaskWebProject1/Include/pystrhex.h new file mode 100644 index 0000000..66a30e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pystrhex.h @@ -0,0 +1,19 @@ +#ifndef Py_STRHEX_H +#define Py_STRHEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +/* Returns a str() containing the hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); +/* Returns a bytes() containing the ASCII hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRHEX_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pystrtod.h b/flaskwebproject/FlaskWebProject1/Include/pystrtod.h new file mode 100644 index 0000000..c1e84de --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pystrtod.h @@ -0,0 +1,45 @@ +#ifndef Py_STRTOD_H +#define Py_STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_FUNC(double) PyOS_string_to_double(const char *str, + char **endptr, + PyObject *overflow_exception); + +/* The caller is responsible for calling PyMem_Free to free the buffer + that's is returned. */ +PyAPI_FUNC(char *) PyOS_double_to_string(double val, + char format_code, + int precision, + int flags, + int *type); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_string_to_number_with_underscores( + const char *str, Py_ssize_t len, const char *what, PyObject *obj, void *arg, + PyObject *(*innerfunc)(const char *, Py_ssize_t, void *)); + +PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); +#endif + + +/* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ +#define Py_DTSF_SIGN 0x01 /* always add the sign */ +#define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ +#define Py_DTSF_ALT 0x04 /* "alternate" formatting. it's format_code + specific */ + +/* PyOS_double_to_string's "type", if non-NULL, will be set to one of: */ +#define Py_DTST_FINITE 0 +#define Py_DTST_INFINITE 1 +#define Py_DTST_NAN 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRTOD_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pythonrun.h b/flaskwebproject/FlaskWebProject1/Include/pythonrun.h new file mode 100644 index 0000000..efc613f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pythonrun.h @@ -0,0 +1,197 @@ + +/* Interfaces to parse and execute pieces of python code */ + +#ifndef Py_PYTHONRUN_H +#define Py_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP) +#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 + +#ifndef Py_LIMITED_API +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ +} PyCompilerFlags; +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); + +PyAPI_FUNC(struct _mod *) PyParser_ASTFromString( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromStringObject( + const char *s, + PyObject *filename, + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( + FILE *fp, + PyObject *filename, + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +#endif + +#ifndef PyParser_SimpleParseString +#define PyParser_SimpleParseString(S, B) \ + PyParser_SimpleParseStringFlags(S, B, 0) +#define PyParser_SimpleParseFile(FP, S, B) \ + PyParser_SimpleParseFileFlags(FP, S, B, 0) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, + int); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, + const char *, + int, int); +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, + int, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyObject *globals, + PyObject *locals, + int closeit, + PyCompilerFlags *flags); +#endif + +#ifdef Py_LIMITED_API +PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int); +#else +#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) +#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) +PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + int optimize); +PyAPI_FUNC(PyObject *) Py_CompileStringObject( + const char *str, + PyObject *filename, int start, + PyCompilerFlags *flags, + int optimize); +#endif +PyAPI_FUNC(struct symtable *) Py_SymtableString( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start); +#ifndef Py_LIMITED_API +PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( + const char *str, + PyObject *filename, + int start); +#endif + +PyAPI_FUNC(void) PyErr_Print(void); +PyAPI_FUNC(void) PyErr_PrintEx(int); +PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) +#endif + +/* Stuff with no proper home (yet) */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); +#endif +PyAPI_DATA(int) (*PyOS_InputHook)(void); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); +#ifndef Py_LIMITED_API +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; +#endif + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to an 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300 +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + +#ifdef USE_STACKCHECK +/* Check that we aren't overflowing our stack */ +PyAPI_FUNC(int) PyOS_CheckStack(void); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHONRUN_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pythread.h b/flaskwebproject/FlaskWebProject1/Include/pythread.h new file mode 100644 index 0000000..88c4873 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pythread.h @@ -0,0 +1,90 @@ + +#ifndef Py_PYTHREAD_H +#define Py_PYTHREAD_H + +typedef void *PyThread_type_lock; +typedef void *PyThread_type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Return status codes for Python lock acquisition. Chosen for maximum + * backwards compatibility, ie failure -> 0, success -> 1. */ +typedef enum PyLockStatus { + PY_LOCK_FAILURE = 0, + PY_LOCK_ACQUIRED = 1, + PY_LOCK_INTR +} PyLockStatus; + +PyAPI_FUNC(void) PyThread_init_thread(void); +PyAPI_FUNC(long) PyThread_start_new_thread(void (*)(void *), void *); +PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(long) PyThread_get_thread_ident(void); + +PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); +PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); +PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); +#define WAIT_LOCK 1 +#define NOWAIT_LOCK 0 + +/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting + on a lock (see PyThread_acquire_lock_timed() below). + PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that + type, and depends on the system threading API. + + NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread + module exposes a higher-level API, with timeouts expressed in seconds + and floating-point numbers allowed. +*/ +#define PY_TIMEOUT_T long long +#define PY_TIMEOUT_MAX PY_LLONG_MAX + +/* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ +#if defined (NT_THREADS) +#if 0xFFFFFFFFLL * 1000 < PY_TIMEOUT_MAX +#undef PY_TIMEOUT_MAX +#define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) +#endif +#endif + +/* If microseconds == 0, the call is non-blocking: it returns immediately + even when the lock can't be acquired. + If microseconds > 0, the call waits up to the specified duration. + If microseconds < 0, the call waits until success (or abnormal failure) + + microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is + undefined. + + If intr_flag is true and the acquire is interrupted by a signal, then the + call will return PY_LOCK_INTR. The caller may reattempt to acquire the + lock. +*/ +PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock, + PY_TIMEOUT_T microseconds, + int intr_flag); + +PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); + +PyAPI_FUNC(size_t) PyThread_get_stacksize(void); +PyAPI_FUNC(int) PyThread_set_stacksize(size_t); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyThread_GetInfo(void); +#endif + +/* Thread Local Storage (TLS) API */ +PyAPI_FUNC(int) PyThread_create_key(void); +PyAPI_FUNC(void) PyThread_delete_key(int); +PyAPI_FUNC(int) PyThread_set_key_value(int, void *); +PyAPI_FUNC(void *) PyThread_get_key_value(int); +PyAPI_FUNC(void) PyThread_delete_key_value(int key); + +/* Cleanup after a fork */ +PyAPI_FUNC(void) PyThread_ReInitTLS(void); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYTHREAD_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/pytime.h b/flaskwebproject/FlaskWebProject1/Include/pytime.h new file mode 100644 index 0000000..158c460 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/pytime.h @@ -0,0 +1,211 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYTIME_H +#define Py_PYTIME_H + +#include "pyconfig.h" /* include for defines */ +#include "object.h" + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to time related +functions and constants +**************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* _PyTime_t: Python timestamp with subsecond precision. It can be used to + store a duration, and so indirectly a date (related to another date, like + UNIX epoch). */ +typedef int64_t _PyTime_t; +#define _PyTime_MIN PY_LLONG_MIN +#define _PyTime_MAX PY_LLONG_MAX + +typedef enum { + /* Round towards minus infinity (-inf). + For example, used to read a clock. */ + _PyTime_ROUND_FLOOR=0, + /* Round towards infinity (+inf). + For example, used for timeout to wait "at least" N seconds. */ + _PyTime_ROUND_CEILING=1, + /* Round to nearest with ties going to nearest even integer. + For example, used to round from a Python float. */ + _PyTime_ROUND_HALF_EVEN=2, + /* Round away from zero + For example, used for timeout. _PyTime_ROUND_CEILING rounds + -1e-9 to 0 milliseconds which causes bpo-31786 issue. + _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps + the timeout sign as expected. select.poll(timeout) must block + for negative values." */ + _PyTime_ROUND_UP=3, + /* _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be + used for timeouts. */ + _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP +} _PyTime_round_t; + + +/* Convert a time_t to a PyLong. */ +PyAPI_FUNC(PyObject *) _PyLong_FromTime_t( + time_t sec); + +/* Convert a PyLong to a time_t. */ +PyAPI_FUNC(time_t) _PyLong_AsTime_t( + PyObject *obj); + +/* Convert a number of seconds, int or float, to time_t. */ +PyAPI_FUNC(int) _PyTime_ObjectToTime_t( + PyObject *obj, + time_t *sec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timeval structure. + usec is in the range [0; 999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimeval( + PyObject *obj, + time_t *sec, + long *usec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timespec structure. + nsec is in the range [0; 999999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimespec( + PyObject *obj, + time_t *sec, + long *nsec, + _PyTime_round_t); + + +/* Create a timestamp from a number of seconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); + +/* Macro to create a timestamp from a number of seconds, no integer overflow. + Only use the macro for small values, prefer _PyTime_FromSeconds(). */ +#define _PYTIME_FROMSECONDS(seconds) \ + ((_PyTime_t)(seconds) * (1000 * 1000 * 1000)) + +/* Create a timestamp from a number of nanoseconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(long long ns); + +/* Convert a number of seconds (Python float or int) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a number of milliseconds (Python float or int, 10^-3) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds as a C double. */ +PyAPI_FUNC(double) _PyTime_AsSecondsDouble(_PyTime_t t); + +/* Convert timestamp to a number of milliseconds (10^-3 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of microseconds (10^-6 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int + object. */ +PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t); + +/* Convert a timestamp to a timeval structure (microsecond resolution). + tv_usec is always positive. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */ +PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds (secs) and microseconds (us). + us is always positive. This function is similar to _PyTime_AsTimeval() + except that secs is always a time_t type, whereas the timeval structure + uses a C long for tv_sec on Windows. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( + _PyTime_t t, + time_t *secs, + int *us, + _PyTime_round_t round); + +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) +/* Convert a timestamp to a timespec structure (nanosecond resolution). + tv_nsec is always positive. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); +#endif + +/* Get the current time from the system clock. + + The function cannot fail. _PyTime_Init() ensures that the system clock + works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + The function cannot fail. _PyTime_Init() ensures that a monotonic clock + is available and works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); + + +/* Structure used by time.get_clock_info() */ +typedef struct { + const char *implementation; + int monotonic; + int adjustable; + double resolution; +} _Py_clock_info_t; + +/* Get the current time from the system clock. + * Fill clock information if info is not NULL. + * Raise an exception and return -1 on error, return 0 on success. + */ +PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + Fill info (if set) with information of the function used to get the time. + + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + + +/* Initialize time. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_Init(void); + +/* Converts a timestamp to the Gregorian time, using the local time zone. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); + +/* Converts a timestamp to the Gregorian time, assuming UTC. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_PYTIME_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/rangeobject.h b/flaskwebproject/FlaskWebProject1/Include/rangeobject.h new file mode 100644 index 0000000..7e4dc28 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/rangeobject.h @@ -0,0 +1,27 @@ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; +PyAPI_DATA(PyTypeObject) PyRangeIter_Type; +PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; + +#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/setobject.h b/flaskwebproject/FlaskWebProject1/Include/setobject.h new file mode 100644 index 0000000..87ec1c8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/setobject.h @@ -0,0 +1,108 @@ +/* Set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + +/* There are three kinds of entries in the table: + +1. Unused: key == NULL and hash == 0 +2. Dummy: key == dummy and hash == -1 +3. Active: key != NULL and key != dummy and hash != -1 + +The hash field of Unused slots is always zero. + +The hash field of Dummy slots are set to -1 +meaning that dummy entries can be detected by +either entry->key==dummy or by entry->hash==-1. +*/ + +#define PySet_MINSIZE 8 + +typedef struct { + PyObject *key; + Py_hash_t hash; /* Cached hash code of the key */ +} setentry; + +/* The SetObject data structure is shared by set and frozenset objects. + +Invariant for sets: + - hash is -1 + +Invariants for frozensets: + - data is immutable. + - hash is the hash of the frozenset or -1 if not computed yet. + +*/ + +typedef struct { + PyObject_HEAD + + Py_ssize_t fill; /* Number active and dummy entries*/ + Py_ssize_t used; /* Number active entries */ + + /* The table contains mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t mask; + + /* The table points to a fixed-size smalltable for small tables + * or to additional malloc'ed memory for bigger tables. + * The table pointer is never NULL which saves us from repeated + * runtime null-tests. + */ + setentry *table; + Py_hash_t hash; /* Only used by frozenset objects */ + Py_ssize_t finger; /* Search finger for pop() */ + + setentry smalltable[PySet_MINSIZE]; + PyObject *weakreflist; /* List of weak references */ +} PySetObject; + +#define PySet_GET_SIZE(so) (((PySetObject *)(so))->used) + +PyAPI_DATA(PyObject *) _PySet_Dummy; + +PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); +PyAPI_FUNC(int) PySet_ClearFreeList(void); + +#endif /* Section excluded by Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PySet_Type; +PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; +PyAPI_DATA(PyTypeObject) PySetIter_Type; + +PyAPI_FUNC(PyObject *) PySet_New(PyObject *); +PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *); + +PyAPI_FUNC(int) PySet_Add(PyObject *set, PyObject *key); +PyAPI_FUNC(int) PySet_Clear(PyObject *set); +PyAPI_FUNC(int) PySet_Contains(PyObject *anyset, PyObject *key); +PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); +PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); +PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); + +#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_CheckExact(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) +#define PySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) +#define PyFrozenSet_Check(ob) \ + (Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/sliceobject.h b/flaskwebproject/FlaskWebProject1/Include/sliceobject.h new file mode 100644 index 0000000..579ac07 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/sliceobject.h @@ -0,0 +1,65 @@ +#ifndef Py_SLICEOBJECT_H +#define Py_SLICEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* The unique ellipsis object "..." */ + +PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ + +#define Py_Ellipsis (&_Py_EllipsisObject) + +/* Slice object interface */ + +/* + +A slice object containing start, stop, and step data members (the +names are from range). After much talk with Guido, it was decided to +let these be any arbitrary python type. Py_None stands for omitted values. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + PyObject *start, *stop, *step; /* not NULL */ +} PySliceObject; +#endif + +PyAPI_DATA(PyTypeObject) PySlice_Type; +PyAPI_DATA(PyTypeObject) PyEllipsis_Type; + +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) + +PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, + PyObject* step); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop); +PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, + PyObject **start_ptr, PyObject **stop_ptr, + PyObject **step_ptr); +#endif +PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength); + +#if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 +#ifdef Py_LIMITED_API +#define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ + PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \ + ((*(slicelen) = 0), -1) : \ + ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ + 0)) +#endif +PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t step); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SLICEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/structmember.h b/flaskwebproject/FlaskWebProject1/Include/structmember.h new file mode 100644 index 0000000..5da8a46 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/structmember.h @@ -0,0 +1,74 @@ +#ifndef Py_STRUCTMEMBER_H +#define Py_STRUCTMEMBER_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to map C struct members to Python object attributes */ + +#include /* For offsetof */ + +/* An array of PyMemberDef structures defines the name, type and offset + of selected members of a C structure. These can be read by + PyMember_GetOne() and set by PyMember_SetOne() (except if their READONLY + flag is set). The array must be terminated with an entry whose name + pointer is NULL. */ + +typedef struct PyMemberDef { + char *name; + int type; + Py_ssize_t offset; + int flags; + char *doc; +} PyMemberDef; + +/* Types */ +#define T_SHORT 0 +#define T_INT 1 +#define T_LONG 2 +#define T_FLOAT 3 +#define T_DOUBLE 4 +#define T_STRING 5 +#define T_OBJECT 6 +/* XXX the ordering here is weird for binary compatibility */ +#define T_CHAR 7 /* 1-character string */ +#define T_BYTE 8 /* 8-bit signed int */ +/* unsigned variants: */ +#define T_UBYTE 9 +#define T_USHORT 10 +#define T_UINT 11 +#define T_ULONG 12 + +/* Added by Jack: strings contained in the structure */ +#define T_STRING_INPLACE 13 + +/* Added by Lillo: bools contained in the structure (assumed char) */ +#define T_BOOL 14 + +#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError + when the value is NULL, instead of + converting to None. */ +#define T_LONGLONG 17 +#define T_ULONGLONG 18 + +#define T_PYSSIZET 19 /* Py_ssize_t */ +#define T_NONE 20 /* Value is always None */ + + +/* Flags */ +#define READONLY 1 +#define READ_RESTRICTED 2 +#define PY_WRITE_RESTRICTED 4 +#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) + + +/* Current API, use this */ +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); +PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTMEMBER_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/structseq.h b/flaskwebproject/FlaskWebProject1/Include/structseq.h new file mode 100644 index 0000000..af22716 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/structseq.h @@ -0,0 +1,49 @@ + +/* Named tuple object interface */ + +#ifndef Py_STRUCTSEQ_H +#define Py_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyStructSequence_Field { + char *name; + char *doc; +} PyStructSequence_Field; + +typedef struct PyStructSequence_Desc { + char *name; + char *doc; + struct PyStructSequence_Field *fields; + int n_in_sequence; +} PyStructSequence_Desc; + +extern char* PyStructSequence_UnnamedField; + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, + PyStructSequence_Desc *desc); +PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type, + PyStructSequence_Desc *desc); +#endif +PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc); + +PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); + +#ifndef Py_LIMITED_API +typedef PyTupleObject PyStructSequence; + +/* Macro, *only* to be used to fill in brand new objects */ +#define PyStructSequence_SET_ITEM(op, i, v) PyTuple_SET_ITEM(op, i, v) + +#define PyStructSequence_GET_ITEM(op, i) PyTuple_GET_ITEM(op, i) +#endif + +PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); +PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTSEQ_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/symtable.h b/flaskwebproject/FlaskWebProject1/Include/symtable.h new file mode 100644 index 0000000..86ae3c2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/symtable.h @@ -0,0 +1,119 @@ +#ifndef Py_LIMITED_API +#ifndef Py_SYMTABLE_H +#define Py_SYMTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal + * names. + */ + +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } + _Py_block_ty; + +struct _symtable_entry; + +struct symtable { + PyObject *st_filename; /* name of file being compiled, + decoded from the filesystem encoding */ + struct _symtable_entry *st_cur; /* current symbol table entry */ + struct _symtable_entry *st_top; /* symbol table entry for module */ + PyObject *st_blocks; /* dict: map AST node addresses + * to symbol table entries */ + PyObject *st_stack; /* list: stack of namespace info */ + PyObject *st_global; /* borrowed ref to st_top->ste_symbols */ + int st_nblocks; /* number of blocks used. kept for + consistency with the corresponding + compiler structure */ + PyObject *st_private; /* name of current class or NULL */ + PyFutureFeatures *st_future; /* module's future features that affect + the symbol table */ + int recursion_depth; /* current recursion depth */ + int recursion_limit; /* recursion limit */ +}; + +typedef struct _symtable_entry { + PyObject_HEAD + PyObject *ste_id; /* int: key in ste_table->st_blocks */ + PyObject *ste_symbols; /* dict: variable names to flags */ + PyObject *ste_name; /* string: name of current block */ + PyObject *ste_varnames; /* list of function parameters */ + PyObject *ste_children; /* list of child blocks */ + PyObject *ste_directives;/* locations of global and nonlocal statements */ + _Py_block_ty ste_type; /* module, class, or function */ + int ste_nested; /* true if block is nested */ + unsigned ste_free : 1; /* true if block has free variables */ + unsigned ste_child_free : 1; /* true if a child block has free vars, + including free refs to globals */ + unsigned ste_generator : 1; /* true if namespace is a generator */ + unsigned ste_coroutine : 1; /* true if namespace is a coroutine */ + unsigned ste_varargs : 1; /* true if block has varargs */ + unsigned ste_varkeywords : 1; /* true if block has varkeywords */ + unsigned ste_returns_value : 1; /* true if namespace uses return with + an argument */ + unsigned ste_needs_class_closure : 1; /* for class scopes, true if a + closure over __class__ + should be created */ + int ste_lineno; /* first line of block */ + int ste_col_offset; /* offset of first line of block */ + int ste_opt_lineno; /* lineno of last exec or import * */ + int ste_opt_col_offset; /* offset of last exec or import * */ + int ste_tmpname; /* counter for listcomp temp vars */ + struct symtable *ste_table; +} PySTEntryObject; + +PyAPI_DATA(PyTypeObject) PySTEntry_Type; + +#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) + +PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); + +PyAPI_FUNC(struct symtable *) PySymtable_Build( + mod_ty mod, + const char *filename, /* decoded from the filesystem encoding */ + PyFutureFeatures *future); +PyAPI_FUNC(struct symtable *) PySymtable_BuildObject( + mod_ty mod, + PyObject *filename, + PyFutureFeatures *future); +PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + +PyAPI_FUNC(void) PySymtable_Free(struct symtable *); + +/* Flags for def-use information */ + +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM 2<<1 /* formal parameter */ +#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */ +#define USE 2<<3 /* name is used */ +#define DEF_FREE 2<<4 /* name used but not defined in nested block */ +#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */ +#define DEF_IMPORT 2<<6 /* assignment occurred via import */ +#define DEF_ANNOT 2<<7 /* this name is annotated */ + +#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) + +/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol + table. GLOBAL is returned from PyST_GetScope() for either of them. + It is stored in ste_symbols at bits 12-15. +*/ +#define SCOPE_OFFSET 11 +#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL) + +#define LOCAL 1 +#define GLOBAL_EXPLICIT 2 +#define GLOBAL_IMPLICIT 3 +#define FREE 4 +#define CELL 5 + +#define GENERATOR 1 +#define GENERATOR_EXPRESSION 2 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYMTABLE_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/sysmodule.h b/flaskwebproject/FlaskWebProject1/Include/sysmodule.h new file mode 100644 index 0000000..c5547ff --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/sysmodule.h @@ -0,0 +1,43 @@ + +/* System module interface */ + +#ifndef Py_SYSMODULE_H +#define Py_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); +PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); +PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); +#endif + +PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); +PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); +PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); +PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); + +PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *); +PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *); +PyAPI_FUNC(int) PySys_HasWarnOptions(void); + +PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); +PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYSMODULE_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/token.h b/flaskwebproject/FlaskWebProject1/Include/token.h new file mode 100644 index 0000000..595afa0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/token.h @@ -0,0 +1,90 @@ + +/* Token types */ +#ifndef Py_LIMITED_API +#ifndef Py_TOKEN_H +#define Py_TOKEN_H +#ifdef __cplusplus +extern "C" { +#endif + +#undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ + +#define ENDMARKER 0 +#define NAME 1 +#define NUMBER 2 +#define STRING 3 +#define NEWLINE 4 +#define INDENT 5 +#define DEDENT 6 +#define LPAR 7 +#define RPAR 8 +#define LSQB 9 +#define RSQB 10 +#define COLON 11 +#define COMMA 12 +#define SEMI 13 +#define PLUS 14 +#define MINUS 15 +#define STAR 16 +#define SLASH 17 +#define VBAR 18 +#define AMPER 19 +#define LESS 20 +#define GREATER 21 +#define EQUAL 22 +#define DOT 23 +#define PERCENT 24 +#define LBRACE 25 +#define RBRACE 26 +#define EQEQUAL 27 +#define NOTEQUAL 28 +#define LESSEQUAL 29 +#define GREATEREQUAL 30 +#define TILDE 31 +#define CIRCUMFLEX 32 +#define LEFTSHIFT 33 +#define RIGHTSHIFT 34 +#define DOUBLESTAR 35 +#define PLUSEQUAL 36 +#define MINEQUAL 37 +#define STAREQUAL 38 +#define SLASHEQUAL 39 +#define PERCENTEQUAL 40 +#define AMPEREQUAL 41 +#define VBAREQUAL 42 +#define CIRCUMFLEXEQUAL 43 +#define LEFTSHIFTEQUAL 44 +#define RIGHTSHIFTEQUAL 45 +#define DOUBLESTAREQUAL 46 +#define DOUBLESLASH 47 +#define DOUBLESLASHEQUAL 48 +#define AT 49 +#define ATEQUAL 50 +#define RARROW 51 +#define ELLIPSIS 52 +/* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ +#define OP 53 +#define AWAIT 54 +#define ASYNC 55 +#define ERRORTOKEN 56 +#define N_TOKENS 57 + +/* Special definitions for cooperation with parser */ + +#define NT_OFFSET 256 + +#define ISTERMINAL(x) ((x) < NT_OFFSET) +#define ISNONTERMINAL(x) ((x) >= NT_OFFSET) +#define ISEOF(x) ((x) == ENDMARKER) + + +PyAPI_DATA(const char *) _PyParser_TokenNames[]; /* Token names */ +PyAPI_FUNC(int) PyToken_OneChar(int); +PyAPI_FUNC(int) PyToken_TwoChars(int, int); +PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TOKEN_H */ +#endif /* Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/traceback.h b/flaskwebproject/FlaskWebProject1/Include/traceback.h new file mode 100644 index 0000000..b587410 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/traceback.h @@ -0,0 +1,119 @@ + +#ifndef Py_TRACEBACK_H +#define Py_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pystate.h" + +struct _frame; + +/* Traceback interface */ +#ifndef Py_LIMITED_API +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; +#endif + +PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); +PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); +#endif + +/* Reveal traceback type so we can typecheck traceback objects */ +PyAPI_DATA(PyTypeObject) PyTraceBack_Type; +#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) + +#ifndef Py_LIMITED_API +/* Write the Python traceback into the file 'fd'. For example: + + Traceback (most recent call first): + File "xxx", line xxx in + File "xxx", line xxx in + ... + File "xxx", line xxx in + + This function is written for debug purpose only, to dump the traceback in + the worst case: after a segmentation fault, at fatal error, etc. That's why, + it is very limited. Strings are truncated to 100 characters and encoded to + ASCII with backslashreplace. It doesn't write the source code, only the + function name, filename and line number of each frame. Write only the first + 100 frames: if the traceback is truncated, write the line " ...". + + This function is signal safe. */ + +PyAPI_FUNC(void) _Py_DumpTraceback( + int fd, + PyThreadState *tstate); + +/* Write the traceback of all threads into the file 'fd'. current_thread can be + NULL. + + Return NULL on success, or an error message on error. + + This function is written for debug purpose only. It calls + _Py_DumpTraceback() for each thread, and so has the same limitations. It + only write the traceback of the first 100 threads: write "..." if there are + more threads. + + If current_tstate is NULL, the function tries to get the Python thread state + of the current thread. It is not an error if the function is unable to get + the current Python thread state. + + If interp is NULL, the function tries to get the interpreter state from + the current Python thread state, or from + _PyGILState_GetInterpreterStateUnsafe() in last resort. + + It is better to pass NULL to interp and current_tstate, the function tries + different options to retrieve these informations. + + This function is signal safe. */ + +PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( + int fd, + PyInterpreterState *interp, + PyThreadState *current_tstate); +#endif /* !Py_LIMITED_API */ + +#ifndef Py_LIMITED_API + +/* Write a Unicode object into the file descriptor fd. Encode the string to + ASCII using the backslashreplace error handler. + + Do nothing if text is not a Unicode object. The function accepts Unicode + string which is not ready (PyUnicode_WCHAR_KIND). + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); + +/* Format an integer as decimal into the file descriptor fd. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpDecimal( + int fd, + unsigned long value); + +/* Format an integer as hexadecimal into the file descriptor fd with at least + width digits. + + The maximum width is sizeof(unsigned long)*2 digits. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpHexadecimal( + int fd, + unsigned long value, + Py_ssize_t width); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TRACEBACK_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/tupleobject.h b/flaskwebproject/FlaskWebProject1/Include/tupleobject.h new file mode 100644 index 0000000..c273ce7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/tupleobject.h @@ -0,0 +1,73 @@ + +/* Tuple object interface */ + +#ifndef Py_TUPLEOBJECT_H +#define Py_TUPLEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +Another generally useful object type is a tuple of object pointers. +For Python, this is an immutable type. C code can change the tuple items +(but not their number), and even use tuples are general-purpose arrays of +object references, but in general only brand new tuples should be mutated, +not ones that might already have been exposed to Python code. + +*** WARNING *** PyTuple_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the tuple. Similarly, PyTuple_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be NULL, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +} PyTupleObject; +#endif + +PyAPI_DATA(PyTypeObject) PyTuple_Type; +PyAPI_DATA(PyTypeObject) PyTupleIter_Type; + +#define PyTuple_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) + +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); +#endif +PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) +#define PyTuple_GET_SIZE(op) Py_SIZE(op) + +/* Macro, *only* to be used to fill in brand new tuples */ +#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) +#endif + +PyAPI_FUNC(int) PyTuple_ClearFreeList(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/typeslots.h b/flaskwebproject/FlaskWebProject1/Include/typeslots.h new file mode 100644 index 0000000..0ce6a37 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/typeslots.h @@ -0,0 +1,85 @@ +/* Do not renumber the file; these numbers are part of the stable ABI. */ +/* Disabled, see #10181 */ +#undef Py_bf_getbuffer +#undef Py_bf_releasebuffer +#define Py_mp_ass_subscript 3 +#define Py_mp_length 4 +#define Py_mp_subscript 5 +#define Py_nb_absolute 6 +#define Py_nb_add 7 +#define Py_nb_and 8 +#define Py_nb_bool 9 +#define Py_nb_divmod 10 +#define Py_nb_float 11 +#define Py_nb_floor_divide 12 +#define Py_nb_index 13 +#define Py_nb_inplace_add 14 +#define Py_nb_inplace_and 15 +#define Py_nb_inplace_floor_divide 16 +#define Py_nb_inplace_lshift 17 +#define Py_nb_inplace_multiply 18 +#define Py_nb_inplace_or 19 +#define Py_nb_inplace_power 20 +#define Py_nb_inplace_remainder 21 +#define Py_nb_inplace_rshift 22 +#define Py_nb_inplace_subtract 23 +#define Py_nb_inplace_true_divide 24 +#define Py_nb_inplace_xor 25 +#define Py_nb_int 26 +#define Py_nb_invert 27 +#define Py_nb_lshift 28 +#define Py_nb_multiply 29 +#define Py_nb_negative 30 +#define Py_nb_or 31 +#define Py_nb_positive 32 +#define Py_nb_power 33 +#define Py_nb_remainder 34 +#define Py_nb_rshift 35 +#define Py_nb_subtract 36 +#define Py_nb_true_divide 37 +#define Py_nb_xor 38 +#define Py_sq_ass_item 39 +#define Py_sq_concat 40 +#define Py_sq_contains 41 +#define Py_sq_inplace_concat 42 +#define Py_sq_inplace_repeat 43 +#define Py_sq_item 44 +#define Py_sq_length 45 +#define Py_sq_repeat 46 +#define Py_tp_alloc 47 +#define Py_tp_base 48 +#define Py_tp_bases 49 +#define Py_tp_call 50 +#define Py_tp_clear 51 +#define Py_tp_dealloc 52 +#define Py_tp_del 53 +#define Py_tp_descr_get 54 +#define Py_tp_descr_set 55 +#define Py_tp_doc 56 +#define Py_tp_getattr 57 +#define Py_tp_getattro 58 +#define Py_tp_hash 59 +#define Py_tp_init 60 +#define Py_tp_is_gc 61 +#define Py_tp_iter 62 +#define Py_tp_iternext 63 +#define Py_tp_methods 64 +#define Py_tp_new 65 +#define Py_tp_repr 66 +#define Py_tp_richcompare 67 +#define Py_tp_setattr 68 +#define Py_tp_setattro 69 +#define Py_tp_str 70 +#define Py_tp_traverse 71 +#define Py_tp_members 72 +#define Py_tp_getset 73 +#define Py_tp_free 74 +#define Py_nb_matrix_multiply 75 +#define Py_nb_inplace_matrix_multiply 76 +#define Py_am_await 77 +#define Py_am_aiter 78 +#define Py_am_anext 79 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +#define Py_tp_finalize 80 +#endif diff --git a/flaskwebproject/FlaskWebProject1/Include/ucnhash.h b/flaskwebproject/FlaskWebProject1/Include/ucnhash.h new file mode 100644 index 0000000..45362e9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/ucnhash.h @@ -0,0 +1,36 @@ +/* Unicode name database interface */ +#ifndef Py_LIMITED_API +#ifndef Py_UCNHASH_H +#define Py_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" + +typedef struct { + + /* Size of this struct */ + int size; + + /* Get name for a given character code. Returns non-zero if + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq); + + /* Get character code for a given name. Same error handling + as for getname. */ + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UCNHASH_H */ +#endif /* !Py_LIMITED_API */ diff --git a/flaskwebproject/FlaskWebProject1/Include/unicodeobject.h b/flaskwebproject/FlaskWebProject1/Include/unicodeobject.h new file mode 100644 index 0000000..f498873 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/unicodeobject.h @@ -0,0 +1,2342 @@ +#ifndef Py_UNICODEOBJECT_H +#define Py_UNICODEOBJECT_H + +#include + +/* + +Unicode implementation based on original code by Fredrik Lundh, +modified by Marc-Andre Lemburg (mal@lemburg.com) according to the +Unicode Integration Proposal. (See +http://www.egenix.com/files/python/unicode-proposal.txt). + +Copyright (c) Corporation for National Research Initiatives. + + + Original header: + -------------------------------------------------------------------- + + * Yet another Unicode string type for Python. This type supports the + * 16-bit Basic Multilingual Plane (BMP) only. + * + * Written by Fredrik Lundh, January 1999. + * + * Copyright (c) 1999 by Secret Labs AB. + * Copyright (c) 1999 by Fredrik Lundh. + * + * fredrik@pythonware.com + * http://www.pythonware.com + * + * -------------------------------------------------------------------- + * This Unicode String Type is + * + * Copyright (c) 1999 by Secret Labs AB + * Copyright (c) 1999 by Fredrik Lundh + * + * By obtaining, using, and/or copying this software and/or its + * associated documentation, you agree that you have read, understood, + * and will comply with the following terms and conditions: + * + * Permission to use, copy, modify, and distribute this software and its + * associated documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appears in all + * copies, and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Secret Labs + * AB or the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, 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. + * -------------------------------------------------------------------- */ + +#include + +/* === Internal API ======================================================= */ + +/* --- Internal Unicode Format -------------------------------------------- */ + +/* Python 3.x requires unicode */ +#define Py_USING_UNICODE + +#ifndef SIZEOF_WCHAR_T +#error Must define SIZEOF_WCHAR_T +#endif + +#define Py_UNICODE_SIZE SIZEOF_WCHAR_T + +/* If wchar_t can be used for UCS-4 storage, set Py_UNICODE_WIDE. + Otherwise, Unicode strings are stored as UCS-2 (with limited support + for UTF-16) */ + +#if Py_UNICODE_SIZE >= 4 +#define Py_UNICODE_WIDE +#endif + +/* Set these flags if the platform has "wchar.h" and the + wchar_t type is a 16-bit unsigned type */ +/* #define HAVE_WCHAR_H */ +/* #define HAVE_USABLE_WCHAR_T */ + +/* Py_UNICODE was the native Unicode storage format (code unit) used by + Python and represents a single Unicode element in the Unicode type. + With PEP 393, Py_UNICODE is deprecated and replaced with a + typedef to wchar_t. */ + +#ifndef Py_LIMITED_API +#define PY_UNICODE_TYPE wchar_t +typedef wchar_t Py_UNICODE; +#endif + +/* If the compiler provides a wchar_t type we try to support it + through the interface functions PyUnicode_FromWideChar(), + PyUnicode_AsWideChar() and PyUnicode_AsWideCharString(). */ + +#ifdef HAVE_USABLE_WCHAR_T +# ifndef HAVE_WCHAR_H +# define HAVE_WCHAR_H +# endif +#endif + +#ifdef HAVE_WCHAR_H +/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */ +# ifdef _HAVE_BSDI +# include +# endif +# include +#endif + +/* Py_UCS4 and Py_UCS2 are typedefs for the respective + unicode representations. */ +typedef uint32_t Py_UCS4; +typedef uint16_t Py_UCS2; +typedef uint8_t Py_UCS1; + +/* --- Internal Unicode Operations ---------------------------------------- */ + +/* Since splitting on whitespace is an important use case, and + whitespace in most situations is solely ASCII whitespace, we + optimize for the common case by using a quick look-up table + _Py_ascii_whitespace (see below) with an inlined check. + + */ +#ifndef Py_LIMITED_API +#define Py_UNICODE_ISSPACE(ch) \ + ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) +#define Py_UNICODE_ISPRINTABLE(ch) _PyUnicode_IsPrintable(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +#define Py_UNICODE_ISALNUM(ch) \ + (Py_UNICODE_ISALPHA(ch) || \ + Py_UNICODE_ISDECIMAL(ch) || \ + Py_UNICODE_ISDIGIT(ch) || \ + Py_UNICODE_ISNUMERIC(ch)) + +#define Py_UNICODE_COPY(target, source, length) \ + memcpy((target), (source), (length)*sizeof(Py_UNICODE)) + +#define Py_UNICODE_FILL(target, value, length) \ + do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ + for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ + } while (0) + +/* macros to work with surrogates */ +#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) +#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDBFF) +#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= (ch) && (ch) <= 0xDFFF) +/* Join two surrogate characters and return a single Py_UCS4 value. */ +#define Py_UNICODE_JOIN_SURROGATES(high, low) \ + (((((Py_UCS4)(high) & 0x03FF) << 10) | \ + ((Py_UCS4)(low) & 0x03FF)) + 0x10000) +/* high surrogate = top 10 bits added to D800 */ +#define Py_UNICODE_HIGH_SURROGATE(ch) (0xD800 - (0x10000 >> 10) + ((ch) >> 10)) +/* low surrogate = bottom 10 bits added to DC00 */ +#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) + +/* Check if substring matches at given offset. The offset must be + valid, and the substring must not be empty. */ + +#define Py_UNICODE_MATCH(string, offset, substring) \ + ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \ + ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \ + !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE))) + +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Unicode Type ------------------------------------------------------- */ + +#ifndef Py_LIMITED_API + +/* ASCII-only strings created through PyUnicode_New use the PyASCIIObject + structure. state.ascii and state.compact are set, and the data + immediately follow the structure. utf8_length and wstr_length can be found + in the length field; the utf8 pointer is equal to the data pointer. */ +typedef struct { + /* There are 4 forms of Unicode strings: + + - compact ascii: + + * structure = PyASCIIObject + * test: PyUnicode_IS_COMPACT_ASCII(op) + * kind = PyUnicode_1BYTE_KIND + * compact = 1 + * ascii = 1 + * ready = 1 + * (length is the length of the utf8 and wstr strings) + * (data starts just after the structure) + * (since ASCII is decoded from UTF-8, the utf8 string are the data) + + - compact: + + * structure = PyCompactUnicodeObject + * test: PyUnicode_IS_COMPACT(op) && !PyUnicode_IS_ASCII(op) + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 1 + * ready = 1 + * ascii = 0 + * utf8 is not shared with data + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data and wstr_length=length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_t)=4 + * wstr_length = 0 if wstr is NULL + * (data starts just after the structure) + + - legacy string, not ready: + + * structure = PyUnicodeObject + * test: kind == PyUnicode_WCHAR_KIND + * length = 0 (use wstr_length) + * hash = -1 + * kind = PyUnicode_WCHAR_KIND + * compact = 0 + * ascii = 0 + * ready = 0 + * interned = SSTATE_NOT_INTERNED + * wstr is not NULL + * data.any is NULL + * utf8 is NULL + * utf8_length = 0 + + - legacy string, ready: + + * structure = PyUnicodeObject structure + * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 0 + * ready = 1 + * data.any is not NULL + * utf8 is shared and utf8_length = length with data.any if ascii = 1 + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data.any and wstr_length = length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 + * wstr_length = 0 if wstr is NULL + + Compact strings use only one memory block (structure + characters), + whereas legacy strings use one block for the structure and one block + for characters. + + Legacy strings are created by PyUnicode_FromUnicode() and + PyUnicode_FromStringAndSize(NULL, size) functions. They become ready + when PyUnicode_READY() is called. + + See also _PyUnicode_CheckConsistency(). + */ + PyObject_HEAD + Py_ssize_t length; /* Number of code points in the string */ + Py_hash_t hash; /* Hash value; -1 if not set */ + struct { + /* + SSTATE_NOT_INTERNED (0) + SSTATE_INTERNED_MORTAL (1) + SSTATE_INTERNED_IMMORTAL (2) + + If interned != SSTATE_NOT_INTERNED, the two references from the + dictionary to this object are *not* counted in ob_refcnt. + */ + unsigned int interned:2; + /* Character size: + + - PyUnicode_WCHAR_KIND (0): + + * character type = wchar_t (16 or 32 bits, depending on the + platform) + + - PyUnicode_1BYTE_KIND (1): + + * character type = Py_UCS1 (8 bits, unsigned) + * all characters are in the range U+0000-U+00FF (latin1) + * if ascii is set, all characters are in the range U+0000-U+007F + (ASCII), otherwise at least one character is in the range + U+0080-U+00FF + + - PyUnicode_2BYTE_KIND (2): + + * character type = Py_UCS2 (16 bits, unsigned) + * all characters are in the range U+0000-U+FFFF (BMP) + * at least one character is in the range U+0100-U+FFFF + + - PyUnicode_4BYTE_KIND (4): + + * character type = Py_UCS4 (32 bits, unsigned) + * all characters are in the range U+0000-U+10FFFF + * at least one character is in the range U+10000-U+10FFFF + */ + unsigned int kind:3; + /* Compact is with respect to the allocation scheme. Compact unicode + objects only require one memory block while non-compact objects use + one block for the PyUnicodeObject struct and another for its data + buffer. */ + unsigned int compact:1; + /* The string only contains characters in the range U+0000-U+007F (ASCII) + and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is + set, use the PyASCIIObject structure. */ + unsigned int ascii:1; + /* The ready flag indicates whether the object layout is initialized + completely. This means that this is either a compact object, or + the data pointer is filled out. The bit is redundant, and helps + to minimize the test in PyUnicode_IS_READY(). */ + unsigned int ready:1; + /* Padding to ensure that PyUnicode_DATA() is always aligned to + 4 bytes (see issue #19537 on m68k). */ + unsigned int :24; + } state; + wchar_t *wstr; /* wchar_t representation (null-terminated) */ +} PyASCIIObject; + +/* Non-ASCII strings allocated through PyUnicode_New use the + PyCompactUnicodeObject structure. state.compact is set, and the data + immediately follow the structure. */ +typedef struct { + PyASCIIObject _base; + Py_ssize_t utf8_length; /* Number of bytes in utf8, excluding the + * terminating \0. */ + char *utf8; /* UTF-8 representation (null-terminated) */ + Py_ssize_t wstr_length; /* Number of code points in wstr, possible + * surrogates count as two code points. */ +} PyCompactUnicodeObject; + +/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the + PyUnicodeObject structure. The actual string data is initially in the wstr + block, and copied into the data block using _PyUnicode_Ready. */ +typedef struct { + PyCompactUnicodeObject _base; + union { + void *any; + Py_UCS1 *latin1; + Py_UCS2 *ucs2; + Py_UCS4 *ucs4; + } data; /* Canonical, smallest-form Unicode buffer */ +} PyUnicodeObject; +#endif + +PyAPI_DATA(PyTypeObject) PyUnicode_Type; +PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; + +#define PyUnicode_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) + +/* Fast access macros */ +#ifndef Py_LIMITED_API + +#define PyUnicode_WSTR_LENGTH(op) \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)op)->length : \ + ((PyCompactUnicodeObject*)op)->wstr_length) + +/* Returns the deprecated Py_UNICODE representation's size in code units + (this includes surrogate pairs as 2 units). + If the Py_UNICODE representation is not available, it will be computed + on request. Use PyUnicode_GET_LENGTH() for the length in code points. */ + +#define PyUnicode_GET_SIZE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? \ + PyUnicode_WSTR_LENGTH(op) : \ + ((void)PyUnicode_AsUnicode((PyObject *)(op)), \ + assert(((PyASCIIObject *)(op))->wstr), \ + PyUnicode_WSTR_LENGTH(op))) + +#define PyUnicode_GET_DATA_SIZE(op) \ + (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE) + +/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE + representation on demand. Using this macro is very inefficient now, + try to port your code to use the new PyUnicode_*BYTE_DATA() macros or + use PyUnicode_WRITE() and PyUnicode_READ(). */ + +#define PyUnicode_AS_UNICODE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \ + PyUnicode_AsUnicode((PyObject *)(op))) + +#define PyUnicode_AS_DATA(op) \ + ((const char *)(PyUnicode_AS_UNICODE(op))) + + +/* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ + +/* Values for PyASCIIObject.state: */ + +/* Interning state. */ +#define SSTATE_NOT_INTERNED 0 +#define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 + +/* Return true if the string contains only ASCII characters, or 0 if not. The + string may be compact (PyUnicode_IS_COMPACT_ASCII) or not, but must be + ready. */ +#define PyUnicode_IS_ASCII(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject*)op)->state.ascii) + +/* Return true if the string is compact or 0 if not. + No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT(op) \ + (((PyASCIIObject*)(op))->state.compact) + +/* Return true if the string is a compact ASCII string (use PyASCIIObject + structure), or 0 if not. No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT_ASCII(op) \ + (((PyASCIIObject*)op)->state.ascii && PyUnicode_IS_COMPACT(op)) + +enum PyUnicode_Kind { +/* String contains only wstr byte characters. This is only possible + when the string was created with a legacy API and _PyUnicode_Ready() + has not been called yet. */ + PyUnicode_WCHAR_KIND = 0, +/* Return values of the PyUnicode_KIND() macro: */ + PyUnicode_1BYTE_KIND = 1, + PyUnicode_2BYTE_KIND = 2, + PyUnicode_4BYTE_KIND = 4 +}; + +/* Return pointers to the canonical representation cast to unsigned char, + Py_UCS2, or Py_UCS4 for direct character access. + No checks are performed, use PyUnicode_KIND() before to ensure + these will work correctly. */ + +#define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) +#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) +#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op)) + +/* Return one of the PyUnicode_*_KIND values defined above. */ +#define PyUnicode_KIND(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->state.kind) + +/* Return a void pointer to the raw unicode buffer. */ +#define _PyUnicode_COMPACT_DATA(op) \ + (PyUnicode_IS_ASCII(op) ? \ + ((void*)((PyASCIIObject*)(op) + 1)) : \ + ((void*)((PyCompactUnicodeObject*)(op) + 1))) + +#define _PyUnicode_NONCOMPACT_DATA(op) \ + (assert(((PyUnicodeObject*)(op))->data.any), \ + ((((PyUnicodeObject *)(op))->data.any))) + +#define PyUnicode_DATA(op) \ + (assert(PyUnicode_Check(op)), \ + PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \ + _PyUnicode_NONCOMPACT_DATA(op)) + +/* In the access macros below, "kind" may be evaluated more than once. + All other macro parameters are evaluated exactly once, so it is safe + to put side effects into them (such as increasing the index). */ + +/* Write into the canonical representation, this macro does not do any sanity + checks and is intended for usage in loops. The caller should cache the + kind and data pointers obtained from other macro calls. + index is the index in the string (starts at 0) and value is the new + code point value which should be written to that location. */ +#define PyUnicode_WRITE(kind, data, index, value) \ + do { \ + switch ((kind)) { \ + case PyUnicode_1BYTE_KIND: { \ + ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \ + break; \ + } \ + case PyUnicode_2BYTE_KIND: { \ + ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \ + break; \ + } \ + default: { \ + assert((kind) == PyUnicode_4BYTE_KIND); \ + ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \ + } \ + } \ + } while (0) + +/* Read a code point from the string's canonical representation. No checks + or ready calls are performed. */ +#define PyUnicode_READ(kind, data, index) \ + ((Py_UCS4) \ + ((kind) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(data))[(index)] : \ + ((kind) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(data))[(index)] : \ + ((const Py_UCS4 *)(data))[(index)] \ + ) \ + )) + +/* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it + calls PyUnicode_KIND() and might call it twice. For single reads, use + PyUnicode_READ_CHAR, for multiple consecutive reads callers should + cache kind and use PyUnicode_READ instead. */ +#define PyUnicode_READ_CHAR(unicode, index) \ + (assert(PyUnicode_Check(unicode)), \ + assert(PyUnicode_IS_READY(unicode)), \ + (Py_UCS4) \ + (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ + (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ + ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ + ) \ + )) + +/* Returns the length of the unicode string. The caller has to make sure that + the string has it's canonical representation set before calling + this macro. Call PyUnicode_(FAST_)Ready to ensure that. */ +#define PyUnicode_GET_LENGTH(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->length) + + +/* Fast check to determine whether an object is ready. Equivalent to + PyUnicode_IS_COMPACT(op) || ((PyUnicodeObject*)(op))->data.any) */ + +#define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready) + +/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best + case. If the canonical representation is not yet set, it will still call + _PyUnicode_Ready(). + Returns 0 on success and -1 on errors. */ +#define PyUnicode_READY(op) \ + (assert(PyUnicode_Check(op)), \ + (PyUnicode_IS_READY(op) ? \ + 0 : _PyUnicode_Ready((PyObject *)(op)))) + +/* Return a maximum character value which is suitable for creating another + string based on op. This is always an approximation but more efficient + than iterating over the string. */ +#define PyUnicode_MAX_CHAR_VALUE(op) \ + (assert(PyUnicode_IS_READY(op)), \ + (PyUnicode_IS_ASCII(op) ? \ + (0x7f) : \ + (PyUnicode_KIND(op) == PyUnicode_1BYTE_KIND ? \ + (0xffU) : \ + (PyUnicode_KIND(op) == PyUnicode_2BYTE_KIND ? \ + (0xffffU) : \ + (0x10ffffU))))) + +#endif + +/* --- Constants ---------------------------------------------------------- */ + +/* This Unicode character will be used as replacement character during + decoding if the errors argument is set to "replace". Note: the + Unicode character U+FFFD is the official REPLACEMENT CHARACTER in + Unicode 3.0. */ + +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UCS4) 0xFFFD) + +/* === Public API ========================================================= */ + +/* --- Plain Py_UNICODE --------------------------------------------------- */ + +/* With PEP 393, this is the recommended way to allocate a new unicode object. + This function will allocate the object and its buffer in a single memory + block. Objects created using this function are not resizable. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_New( + Py_ssize_t size, /* Number of code points in the new string */ + Py_UCS4 maxchar /* maximum code point value in the string */ + ); +#endif + +/* Initializes the canonical string representation from the deprecated + wstr/Py_UNICODE representation. This function is used to convert Unicode + objects which were created using the old API to the new flexible format + introduced with PEP 393. + + Don't call this function directly, use the public PyUnicode_READY() macro + instead. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyUnicode_Ready( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* Get a copy of a Unicode string. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_Copy( + PyObject *unicode + ); +#endif + +/* Copy character from one unicode object into another, this function performs + character conversion when necessary and falls back to memcpy() if possible. + + Fail if to is too small (smaller than *how_many* or smaller than + len(from)-from_start), or if kind(from[from_start:from_start+how_many]) > + kind(to), or if *to* has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. + + Pseudo-code: + + how_many = min(how_many, len(from) - from_start) + to[to_start:to_start+how_many] = from[from_start:from_start+how_many] + return how_many + + Note: The function doesn't write a terminating null character. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) PyUnicode_CopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); + +/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so + may crash if parameters are invalid (e.g. if the output string + is too short). */ +PyAPI_FUNC(void) _PyUnicode_FastCopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); +#endif + +#ifndef Py_LIMITED_API +/* Fill a string with a character: write fill_char into + unicode[start:start+length]. + + Fail if fill_char is bigger than the string maximum character, or if the + string has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_Fill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); + +/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash + if parameters are invalid (e.g. if length is longer than the string). */ +PyAPI_FUNC(void) _PyUnicode_FastFill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); +#endif + +/* Create a Unicode Object from the Py_UNICODE buffer u of the given + size. + + u may be NULL which causes the contents to be undefined. It is the + user's responsibility to fill in the needed data afterwards. Note + that modifying the Unicode object contents after construction is + only allowed if u was set to NULL. + + The buffer is copied into the new object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( + const Py_UNICODE *u, /* Unicode buffer */ + Py_ssize_t size /* size of buffer */ + ); +#endif + +/* Similar to PyUnicode_FromUnicode(), but u points to UTF-8 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize( + const char *u, /* UTF-8 encoded string */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated + UTF-8 encoded bytes. The size is determined with strlen(). */ +PyAPI_FUNC(PyObject*) PyUnicode_FromString( + const char *u /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. + Scan the string to find the maximum character. */ +PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( + int kind, + const void *buffer, + Py_ssize_t size); + +/* Create a new string from a buffer of ASCII characters. + WARNING: Don't check if the string contains any non-ASCII character. */ +PyAPI_FUNC(PyObject*) _PyUnicode_FromASCII( + const char *buffer, + Py_ssize_t size); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_Substring( + PyObject *str, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifndef Py_LIMITED_API +/* Compute the maximum character of the substring unicode[start:end]. + Return 127 for an empty string. */ +PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Copy the string into a UCS4 buffer including the null character if copy_null + is set. Return NULL and raise an exception on error. Raise a SystemError if + the buffer is smaller than the string. Return buffer on success. + + buflen is the length of the buffer in (Py_UCS4) characters. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4( + PyObject *unicode, + Py_UCS4* buffer, + Py_ssize_t buflen, + int copy_null); + +/* Copy the string into a UCS4 buffer. A new buffer is allocated using + * PyMem_Malloc; if this fails, NULL is returned with a memory error + exception set. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4Copy(PyObject *unicode); +#endif + +#ifndef Py_LIMITED_API +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string + contains null characters. */ +PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer and save the length at size. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* location where to save the length */ + ); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Get the length of the Unicode object. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength( + PyObject *unicode +); +#endif + +/* Get the number of Py_UNICODE units in the + string representation. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( + PyObject *unicode /* Unicode object */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Read a character from the string. */ + +PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar( + PyObject *unicode, + Py_ssize_t index + ); + +/* Write a character to the string. The string must have been created through + PyUnicode_New, must not be shared, and must not have been hashed yet. + + Return 0 on success, -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_WriteChar( + PyObject *unicode, + Py_ssize_t index, + Py_UCS4 character + ); +#endif + +#ifndef Py_LIMITED_API +/* Get the maximum ordinal for a Unicode character. */ +PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); +#endif + +/* Resize a Unicode object. The length is the number of characters, except + if the kind of the string is PyUnicode_WCHAR_KIND: in this case, the length + is the number of Py_UNICODE characters. + + *unicode is modified to point to the new (resized) object and 0 + returned on success. + + Try to resize the string in place (which is usually faster than allocating + a new string and copy characters), or create a new string. + + Error handling is implemented as follows: an exception is set, -1 + is returned and *unicode left untouched. + + WARNING: The function doesn't check string content, the result may not be a + string in canonical representation. */ + +PyAPI_FUNC(int) PyUnicode_Resize( + PyObject **unicode, /* Pointer to the Unicode object */ + Py_ssize_t length /* New length */ + ); + +/* Decode obj to a Unicode object. + + bytes, bytearray and other bytes-like objects are decoded according to the + given encoding and error handler. The encoding and error handler can be + NULL to have the interface use UTF-8 and "strict". + + All other objects (including Unicode objects) raise an exception. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject( + PyObject *obj, /* Object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Copy an instance of a Unicode subtype to a new true Unicode object if + necessary. If obj is already a true Unicode object (not a subtype), return + the reference with *incremented* refcount. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromObject( + PyObject *obj /* Object */ + ); + +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV( + const char *format, /* ASCII-encoded string */ + va_list vargs + ); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat( + const char *format, /* ASCII-encoded string */ + ... + ); + +#ifndef Py_LIMITED_API +typedef struct { + PyObject *buffer; + void *data; + enum PyUnicode_Kind kind; + Py_UCS4 maxchar; + Py_ssize_t size; + Py_ssize_t pos; + + /* minimum number of allocated characters (default: 0) */ + Py_ssize_t min_length; + + /* minimum character (default: 127, ASCII) */ + Py_UCS4 min_char; + + /* If non-zero, overallocate the buffer (default: 0). */ + unsigned char overallocate; + + /* If readonly is 1, buffer is a shared string (cannot be modified) + and size is set to 0. */ + unsigned char readonly; +} _PyUnicodeWriter ; + +/* Initialize a Unicode writer. + * + * By default, the minimum buffer size is 0 character and overallocation is + * disabled. Set min_length, min_char and overallocate attributes to control + * the allocation of the buffer. */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Init(_PyUnicodeWriter *writer); + +/* Prepare the buffer to write 'length' characters + with the specified maximum character. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_Prepare(WRITER, LENGTH, MAXCHAR) \ + (((MAXCHAR) <= (WRITER)->maxchar \ + && (LENGTH) <= (WRITER)->size - (WRITER)->pos) \ + ? 0 \ + : (((LENGTH) == 0) \ + ? 0 \ + : _PyUnicodeWriter_PrepareInternal((WRITER), (LENGTH), (MAXCHAR)))) + +/* Don't call this function directly, use the _PyUnicodeWriter_Prepare() macro + instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, + Py_ssize_t length, Py_UCS4 maxchar); + +/* Prepare the buffer to have at least the kind KIND. + For example, kind=PyUnicode_2BYTE_KIND ensures that the writer will + support characters in range U+000-U+FFFF. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_PrepareKind(WRITER, KIND) \ + (assert((KIND) != PyUnicode_WCHAR_KIND), \ + (KIND) <= (WRITER)->kind \ + ? 0 \ + : _PyUnicodeWriter_PrepareKindInternal((WRITER), (KIND))) + +/* Don't call this function directly, use the _PyUnicodeWriter_PrepareKind() + macro instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareKindInternal(_PyUnicodeWriter *writer, + enum PyUnicode_Kind kind); + +/* Append a Unicode character. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteChar(_PyUnicodeWriter *writer, + Py_UCS4 ch + ); + +/* Append a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, + PyObject *str /* Unicode string */ + ); + +/* Append a substring of a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, + PyObject *str, /* Unicode string */ + Py_ssize_t start, + Py_ssize_t end + ); + +/* Append an ASCII-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteASCIIString(_PyUnicodeWriter *writer, + const char *str, /* ASCII-encoded byte string */ + Py_ssize_t len /* number of bytes, or -1 if unknown */ + ); + +/* Append a latin1-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteLatin1String(_PyUnicodeWriter *writer, + const char *str, /* latin1-encoded byte string */ + Py_ssize_t len /* length in bytes */ + ); + +/* Get the value of the writer as a Unicode string. Clear the + buffer of the writer. Raise an exception and return NULL + on error. */ +PyAPI_FUNC(PyObject *) +_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer); +#endif + +#ifndef Py_LIMITED_API +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **); +PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); +PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( + const char *u /* UTF-8 encoded string */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void); +#endif + +/* Use only if you know it's a string */ +#define PyUnicode_CHECK_INTERNED(op) \ + (((PyASCIIObject *)(op))->state.interned) + +/* --- wchar_t support for platforms which support it --------------------- */ + +#ifdef HAVE_WCHAR_H + +/* Create a Unicode Object from the wchar_t buffer w of the given + size. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( + const wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Copies the Unicode Object contents into the wchar_t buffer w. At + most size wchar_t characters are copied. + + Note that the resulting wchar_t string may or may not be + 0-terminated. It is the responsibility of the caller to make sure + that the wchar_t string is 0-terminated in case this is required by + the application. + + Returns the number of wchar_t characters copied (excluding a + possibly trailing 0-termination character) or -1 in case of an + error. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar( + PyObject *unicode, /* Unicode object */ + wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Convert the Unicode object to a wide character string. The output string + always ends with a nul character. If size is not NULL, write the number of + wide characters (excluding the null character) into *size. + + Returns a buffer allocated by PyMem_Malloc() (use PyMem_Free() to free it) + on success. On error, returns NULL, *size is undefined and raises a + MemoryError. */ + +PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* number of characters of the result */ + ); + +#ifndef Py_LIMITED_API +/* Similar to PyUnicode_AsWideCharString(unicode, NULL), but check if + the string contains null characters. */ +PyAPI_FUNC(wchar_t*) _PyUnicode_AsWideCharString( + PyObject *unicode /* Unicode object */ + ); + +PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); +#endif + +#endif + +/* --- Unicode ordinals --------------------------------------------------- */ + +/* Create a Unicode Object from the given Unicode code point ordinal. + + The ordinal must be in range(0x110000). A ValueError is + raised in case it is not. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); + +/* --- Free-list management ----------------------------------------------- */ + +/* Clear the free list used by the Unicode implementation. + + This can be used to release memory used for objects on the free + list back to the Python memory allocator. + +*/ + +PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); + +/* === Builtin Codecs ===================================================== + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin str() API. + + Setting encoding to NULL causes the default encoding (UTF-8) to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + +*/ + +/* --- Manage the default encoding ---------------------------------------- */ + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode and the size of the encoded representation + in bytes stored in *size. + + In case of an error, no *size is set. + + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released + when the unicodeobject is deallocated. + + _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to + support the previous internal function with the same behaviour. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed in the future. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) PyUnicode_AsUTF8AndSize( + PyObject *unicode, + Py_ssize_t *size); +#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize +#endif + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode. + + Like PyUnicode_AsUTF8AndSize(), this also caches the UTF-8 representation + in the unicodeobject. + + _PyUnicode_AsString is a #define for PyUnicode_AsUTF8 to + support the previous internal function with the same behaviour. + + Use of this API is DEPRECATED since no size information can be + extracted from the returned data. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed for Python 3.1. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) PyUnicode_AsUTF8(PyObject *unicode); +#define _PyUnicode_AsString PyUnicode_AsUTF8 +#endif + +/* Returns "utf-8". */ + +PyAPI_FUNC(const char*) PyUnicode_GetDefaultEncoding(void); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create a Unicode object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decode a Unicode object unicode and return the result as Python + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Decode a Unicode object unicode and return the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Py_UNICODE buffer of the given size and returns a + Python string object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_Encode( + const Py_UNICODE *s, /* Unicode char buffer */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); +#endif + +/* Encodes a Unicode object and returns the result as Python + object. + + This API is DEPRECATED. It is superceeded by PyUnicode_AsEncodedString() + since all standard encodings (except rot13) encode str to bytes. + Use PyCodec_Encode() for encoding with rot13 and non-standard codecs + that encode form str to non-bytes. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Unicode object and returns the result as Python string + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encodings is rot13. + Use PyCodec_Encode() to encode with rot13 and non-standard codecs + that encode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Build an encoding map. */ + +PyAPI_FUNC(PyObject*) PyUnicode_BuildEncodingMap( + PyObject* string /* 256 character map */ + ); + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7( + PyObject *unicode, /* Unicode object */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); +#endif + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( + PyObject *unicode, + const char *errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); +#endif + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-32 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first four bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32Stateful( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF32String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-32 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( + PyObject *object, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-16 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first two bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF16String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-16 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + + Note that Py_UNICODE data is being interpreted as UTF-16 reduced to + UCS-2. This trick makes it possible to add full UTF-16 capabilities + at a later point without compromising the APIs. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( + PyObject* unicode, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +#ifndef Py_LIMITED_API +/* Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape + chars. */ +PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + const char **first_invalid_escape /* on return, points to first + invalid escaped char in + string. */ +); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); +#endif + +/* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( + const char *string, /* Raw-Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsRawUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ); +#endif + +/* --- Unicode Internal Codec --------------------------------------------- + + Only for internal use in _codecsmodule.c */ + +#ifndef Py_LIMITED_API +PyObject *_PyUnicode_DecodeUnicodeInternal( + const char *string, + Py_ssize_t length, + const char *errors + ); +#endif + +/* --- Latin-1 Codecs ----------------------------------------------------- + + Note: Latin-1 corresponds to the first 256 Unicode ordinals. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( + const char *string, /* Latin-1 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); +#endif + +/* --- ASCII Codecs ------------------------------------------------------- + + Only 7-bit ASCII data is excepted. All other codes generate errors. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( + const char *string, /* ASCII encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); +#endif + +/* --- Character Map Codecs ----------------------------------------------- + + This codec uses mappings to encode and decode characters. + + Decoding mappings must map byte ordinals (integers in the range from 0 to + 255) to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or None. Unmapped data bytes (ones which cause a LookupError) + as well as mapped to None, 0xFFFE or '\ufffe' are treated as "undefined + mapping" and cause an error. + + Encoding mappings must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or None. Unmapped character + ordinals (ones which cause a LookupError) as well as mapped to + None are treated as "undefined mapping" and cause an error. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( + const char *string, /* Encoded string */ + Py_ssize_t length, /* size of string */ + PyObject *mapping, /* decoding mapping */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( + PyObject *unicode, /* Unicode object */ + PyObject *mapping /* encoding mapping */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( + PyObject *unicode, /* Unicode object */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ); +#endif + +/* Translate a Py_UNICODE buffer of the given length by applying a + character mapping table to it and return the resulting Unicode + object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); +#endif + +#ifdef MS_WINDOWS + +/* --- MBCS codecs for Windows -------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCodePageStateful( + int code_page, /* code page number */ + const char *string, /* encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCodePage( + int code_page, /* code page number */ + PyObject *unicode, /* Unicode object */ + const char *errors /* error handling */ + ); +#endif + +#endif /* MS_WINDOWS */ + +/* --- Decimal Encoder ---------------------------------------------------- */ + +/* Takes a Unicode string holding a decimal value and writes it into + an output buffer using standard ASCII digit codes. + + The output buffer has to provide at least length+1 bytes of storage + area. The output string is 0-terminated. + + The encoder converts whitespace to ' ', decimal characters to their + corresponding ASCII digit and all other Latin-1 characters except + \0 as-is. Characters outside this range (Unicode ordinals 1-256) + are treated as errors. This includes embedded NULL bytes. + + Error handling is defined by the errors argument: + + NULL or "strict": raise a ValueError + "ignore": ignore the wrong characters (these are not copied to the + output buffer) + "replace": replaces illegal characters with '?' + + Returns 0 on success, -1 on failure. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyUnicode_EncodeDecimal( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + char *output, /* Output buffer; must have size >= length */ + const char *errors /* error handling */ + ); +#endif + +/* Transforms code points that have decimal digit property to the + corresponding ASCII digit code points. + + Returns a new Unicode string on success, NULL on failure. +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to transform */ + ); +#endif + +/* Similar to PyUnicode_TransformDecimalToASCII(), but takes a PyObject + as argument instead of a raw buffer and length. This function additionally + transforms spaces to ASCII because this is what the callers in longobject, + floatobject, and complexobject did anyways. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* --- Locale encoding --------------------------------------------------- */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Decode a string from the current locale encoding. The decoder is strict if + *surrogateescape* is equal to zero, otherwise it uses the 'surrogateescape' + error handler (PEP 383) to escape undecodable bytes. If a byte sequence can + be decoded as a surrogate character and *surrogateescape* is not equal to + zero, the byte sequence is escaped using the 'surrogateescape' error handler + instead of being decoded. *str* must end with a null character but cannot + contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocaleAndSize( + const char *str, + Py_ssize_t len, + const char *errors); + +/* Similar to PyUnicode_DecodeLocaleAndSize(), but compute the string + length using strlen(). */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocale( + const char *str, + const char *errors); + +/* Encode a Unicode object to the current locale encoding. The encoder is + strict is *surrogateescape* is equal to zero, otherwise the + "surrogateescape" error handler is used. Return a bytes object. The string + cannot contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale( + PyObject *unicode, + const char *errors + ); +#endif + +/* --- File system encoding ---------------------------------------------- */ + +/* ParseTuple converter: encode str objects to bytes using + PyUnicode_EncodeFSDefault(); bytes objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSConverter(PyObject*, void*); + +/* ParseTuple converter: decode bytes objects to unicode using + PyUnicode_DecodeFSDefaultAndSize(); str objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSDecoder(PyObject*, void*); + +/* Decode a null-terminated string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. + + Use PyUnicode_DecodeFSDefaultAndSize() if the string length is known. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefault( + const char *s /* encoded string */ + ); + +/* Decode a string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefaultAndSize( + const char *s, /* encoded string */ + Py_ssize_t size /* size */ + ); + +/* Encode a Unicode object to Py_FileSystemDefaultEncoding with the + "surrogateescape" error handler, and return bytes. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault( + PyObject *unicode + ); + +/* --- Methods & Slots ---------------------------------------------------- + + These are capable of handling Unicode objects and strings on input + (we refer to them as strings in the descriptions) and return + Unicode objects or integers as appropriate. */ + +/* Concat two strings giving a new Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Concat( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings and put the result in *pleft + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_Append( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings, put the result in *pleft and drop the right object + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_AppendAndDel( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. If negative, no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_Split( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Dito, but split at line breaks. + + CRLF is considered to be one line break. Line breaks are not + included in the resulting list. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Splitlines( + PyObject *s, /* String to split */ + int keepends /* If true, line end markers are included */ + ); + +/* Partition a string using a given separator. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Partition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Partition a string using a given separator, searching from the end of the + string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_RPartition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. But unlike PyUnicode_Split + PyUnicode_RSplit splits from the end of the string. If negative, + no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_RSplit( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Translate a string by applying a character mapping table to it and + return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_Translate( + PyObject *str, /* String */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +/* Join a sequence of strings using the given separator and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Join( + PyObject *separator, /* Separator string */ + PyObject *seq /* Sequence object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyUnicode_JoinArray( + PyObject *separator, + PyObject **items, + Py_ssize_t seqlen + ); +#endif /* Py_LIMITED_API */ + +/* Return 1 if substr matches str[start:end] at the given tail end, 0 + otherwise. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( + PyObject *str, /* String */ + PyObject *substr, /* Prefix or Suffix string */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Tail end: -1 prefix, +1 suffix */ + ); + +/* Return the first position of substr in str[start:end] using the + given search direction or -1 if not found. -2 is returned in case + an error occurred and an exception is set. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Find direction: +1 forward, -1 backward */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Like PyUnicode_Find, but search for single character only. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_FindChar( + PyObject *str, + Py_UCS4 ch, + Py_ssize_t start, + Py_ssize_t end, + int direction + ); +#endif + +/* Count the number of occurrences of substr in str[start:end]. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( + PyObject *str, /* String */ + PyObject *substr, /* Substring to count */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ + ); + +/* Replace at most maxcount occurrences of substr in str with replstr + and return the resulting Unicode object. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Replace( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + PyObject *replstr, /* Substring to replace */ + Py_ssize_t maxcount /* Max. number of replacements to apply; + -1 = all */ + ); + +/* Compare two strings and return -1, 0, 1 for less than, equal, + greater than resp. + Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_Compare( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII identifier. Return 1 if true, + 0 otherwise. The right argument must be ASCII identifier. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIId( + PyObject *left, /* Left string */ + _Py_Identifier *right /* Right identifier */ + ); +#endif + +/* Compare a Unicode object with C string and return -1, 0, 1 for less than, + equal, and greater than, respectively. It is best to pass only + ASCII-encoded strings, but the function interprets the input string as + ISO-8859-1 if it contains non-ASCII characters. + This function does not raise exceptions. */ + +PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII string. Return 1 if true, + 0 otherwise. The right argument must be ASCII-encoded string. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); +#endif + +/* Rich compare two strings and return one of the following: + + - NULL in case an exception was raised + - Py_True or Py_False for successful comparisons + - Py_NotImplemented in case the type combination is unknown + + Possible values for op: + + Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_RichCompare( + PyObject *left, /* Left string */ + PyObject *right, /* Right string */ + int op /* Operation: Py_EQ, Py_NE, Py_GT, etc. */ + ); + +/* Apply an argument tuple or dictionary to a format string and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Format( + PyObject *format, /* Format string */ + PyObject *args /* Argument tuple or dictionary */ + ); + +/* Checks whether element is contained in container and return 1/0 + accordingly. + + element has to coerce to a one element Unicode string. -1 is + returned in case of an error. */ + +PyAPI_FUNC(int) PyUnicode_Contains( + PyObject *container, /* Container string */ + PyObject *element /* Element string */ + ); + +/* Checks whether argument is a valid identifier. */ + +PyAPI_FUNC(int) PyUnicode_IsIdentifier(PyObject *s); + +#ifndef Py_LIMITED_API +/* Externally visible for str.strip(unicode) */ +PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( + PyObject *self, + int striptype, + PyObject *sepobj + ); +#endif + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( + PyObject *unicode, + Py_ssize_t index, + Py_ssize_t n_buffer, + void *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + PyObject *thousands_sep, + Py_UCS4 *maxchar); +#endif +/* === Characters Type APIs =============================================== */ + +/* Helper array used by Py_UNICODE_ISSPACE(). */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +/* These should not be used directly. Use the Py_UNICODE_IS* and + Py_UNICODE_TO* macros instead. + + These APIs are implemented in Objects/unicodectype.c. + +*/ + +PyAPI_FUNC(int) _PyUnicode_IsLowercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsUppercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsTitlecase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidStart( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidContinue( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsWhitespace( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsLinebreak( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToLowerFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToTitleFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToUpperFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToFoldedFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_IsCaseIgnorable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsCased( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(double) _PyUnicode_ToNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsPrintable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsAlpha( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(size_t) Py_UNICODE_strlen( + const Py_UNICODE *u + ); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( + Py_UNICODE *s1, + const Py_UNICODE *s2); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( + Py_UNICODE *s1, const Py_UNICODE *s2); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( + Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n); + +PyAPI_FUNC(int) Py_UNICODE_strcmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2 + ); + +PyAPI_FUNC(int) Py_UNICODE_strncmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n + ); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( + const Py_UNICODE *s, + Py_UNICODE c + ); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( + const Py_UNICODE *s, + Py_UNICODE c + ); + +PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); + +/* Create a copy of a unicode string ending with a nul character. Return NULL + and raise a MemoryError exception on memory allocation failure, otherwise + return a new allocated buffer (use PyMem_Free() to free the buffer). */ + +PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( + PyObject *unicode + ); +#endif /* Py_LIMITED_API */ + +#if defined(Py_DEBUG) && !defined(Py_LIMITED_API) +PyAPI_FUNC(int) _PyUnicode_CheckConsistency( + PyObject *op, + int check_content); +#elif !defined(NDEBUG) +/* For asserts that call _PyUnicode_CheckConsistency(), which would + * otherwise be a problem when building with asserts but without Py_DEBUG. */ +#define _PyUnicode_CheckConsistency(op, check_content) PyUnicode_Check(op) +#endif + +#ifndef Py_LIMITED_API +/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ +PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); +/* Clear all static strings. */ +PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); + +/* Fast equality check when the inputs are known to be exact unicode types + and where the hash values are equal (i.e. a very probable match) */ +PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UNICODEOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Include/warnings.h b/flaskwebproject/FlaskWebProject1/Include/warnings.h new file mode 100644 index 0000000..a3f83ff --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/warnings.h @@ -0,0 +1,63 @@ +#ifndef Py_WARNINGS_H +#define Py_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyWarnings_Init(void); +#endif + +PyAPI_FUNC(int) PyErr_WarnEx( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + Py_ssize_t stack_level); +PyAPI_FUNC(int) PyErr_WarnFormat( + PyObject *category, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +/* Emit a ResourceWarning warning */ +PyAPI_FUNC(int) PyErr_ResourceWarning( + PyObject *source, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyErr_WarnExplicitObject( + PyObject *category, + PyObject *message, + PyObject *filename, + int lineno, + PyObject *module, + PyObject *registry); +#endif +PyAPI_FUNC(int) PyErr_WarnExplicit( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + const char *module, /* UTF-8 encoded string */ + PyObject *registry); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) +PyErr_WarnExplicitFormat(PyObject *category, + const char *filename, int lineno, + const char *module, PyObject *registry, + const char *format, ...); +#endif + +/* DEPRECATED: Use PyErr_WarnEx() instead. */ +#ifndef Py_LIMITED_API +#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WARNINGS_H */ + diff --git a/flaskwebproject/FlaskWebProject1/Include/weakrefobject.h b/flaskwebproject/FlaskWebProject1/Include/weakrefobject.h new file mode 100644 index 0000000..1705156 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Include/weakrefobject.h @@ -0,0 +1,86 @@ +/* Weak references objects for Python. */ + +#ifndef Py_WEAKREFOBJECT_H +#define Py_WEAKREFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct _PyWeakReference PyWeakReference; + +/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, + * and CallableProxyType. + */ +#ifndef Py_LIMITED_API +struct _PyWeakReference { + PyObject_HEAD + + /* The object to which this is a weak reference, or Py_None if none. + * Note that this is a stealth reference: wr_object's refcount is + * not incremented to reflect this pointer. + */ + PyObject *wr_object; + + /* A callable to invoke when wr_object dies, or NULL if none. */ + PyObject *wr_callback; + + /* A cache for wr_object's hash code. As usual for hashes, this is -1 + * if the hash code isn't known yet. + */ + Py_hash_t hash; + + /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- + * terminated list of weak references to it. These are the list pointers. + * If wr_object goes away, wr_object is set to Py_None, and these pointers + * have no meaning then. + */ + PyWeakReference *wr_prev; + PyWeakReference *wr_next; +}; +#endif + +PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; +PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; +PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; + +#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) +#define PyWeakref_CheckRefExact(op) \ + (Py_TYPE(op) == &_PyWeakref_RefType) +#define PyWeakref_CheckProxy(op) \ + ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ + (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + +#define PyWeakref_Check(op) \ + (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) + + +PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); + +PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); +#endif + +/* Explanation for the Py_REFCNT() check: when a weakref's target is part + of a long chain of deallocations which triggers the trashcan mechanism, + clearing the weakrefs can be delayed long after the target's refcount + has dropped to zero. In the meantime, code accessing the weakref will + be able to "see" the target object even though it is supposed to be + unreachable. See issue #16602. */ + +#define PyWeakref_GET_OBJECT(ref) \ + (Py_REFCNT(((PyWeakReference *)(ref))->wr_object) > 0 \ + ? ((PyWeakReference *)(ref))->wr_object \ + : Py_None) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WEAKREFOBJECT_H */ diff --git a/flaskwebproject/FlaskWebProject1/Lib/__future__.py b/flaskwebproject/FlaskWebProject1/Lib/__future__.py new file mode 100644 index 0000000..63b2be3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/__future__.py @@ -0,0 +1,140 @@ +"""Record of phased-in incompatible language changes. + +Each line is of the form: + + FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease "," + CompilerFlag ")" + +where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples +of the same form as sys.version_info: + + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) + +OptionalRelease records the first release in which + + from __future__ import FeatureName + +was accepted. + +In the case of MandatoryReleases that have not yet occurred, +MandatoryRelease predicts the release in which the feature will become part +of the language. + +Else MandatoryRelease records when the feature became part of the language; +in releases at or after that, modules no longer need + + from __future__ import FeatureName + +to use the feature in question, but may continue to use such imports. + +MandatoryRelease may also be None, meaning that a planned feature got +dropped. + +Instances of class _Feature have two corresponding methods, +.getOptionalRelease() and .getMandatoryRelease(). + +CompilerFlag is the (bitfield) flag that should be passed in the fourth +argument to the builtin function compile() to enable the feature in +dynamically compiled code. This flag is stored in the .compiler_flag +attribute on _Future instances. These values must match the appropriate +#defines of CO_xxx flags in Include/compile.h. + +No feature line is ever to be deleted from this file. +""" + +all_feature_names = [ + "nested_scopes", + "generators", + "division", + "absolute_import", + "with_statement", + "print_function", + "unicode_literals", + "barry_as_FLUFL", + "generator_stop", +] + +__all__ = ["all_feature_names"] + all_feature_names + +# The CO_xxx symbols are defined here under the same names used by +# compile.h, so that an editor search will find them here. However, +# they're not exported in __all__, because they don't really belong to +# this module. +CO_NESTED = 0x0010 # nested_scopes +CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) +CO_FUTURE_DIVISION = 0x2000 # division +CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # perform absolute imports by default +CO_FUTURE_WITH_STATEMENT = 0x8000 # with statement +CO_FUTURE_PRINT_FUNCTION = 0x10000 # print function +CO_FUTURE_UNICODE_LITERALS = 0x20000 # unicode string literals +CO_FUTURE_BARRY_AS_BDFL = 0x40000 +CO_FUTURE_GENERATOR_STOP = 0x80000 # StopIteration becomes RuntimeError in generators + +class _Feature: + def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): + self.optional = optionalRelease + self.mandatory = mandatoryRelease + self.compiler_flag = compiler_flag + + def getOptionalRelease(self): + """Return first release in which this feature was recognized. + + This is a 5-tuple, of the same form as sys.version_info. + """ + + return self.optional + + def getMandatoryRelease(self): + """Return release in which this feature will become mandatory. + + This is a 5-tuple, of the same form as sys.version_info, or, if + the feature was dropped, is None. + """ + + return self.mandatory + + def __repr__(self): + return "_Feature" + repr((self.optional, + self.mandatory, + self.compiler_flag)) + +nested_scopes = _Feature((2, 1, 0, "beta", 1), + (2, 2, 0, "alpha", 0), + CO_NESTED) + +generators = _Feature((2, 2, 0, "alpha", 1), + (2, 3, 0, "final", 0), + CO_GENERATOR_ALLOWED) + +division = _Feature((2, 2, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_DIVISION) + +absolute_import = _Feature((2, 5, 0, "alpha", 1), + (3, 0, 0, "alpha", 0), + CO_FUTURE_ABSOLUTE_IMPORT) + +with_statement = _Feature((2, 5, 0, "alpha", 1), + (2, 6, 0, "alpha", 0), + CO_FUTURE_WITH_STATEMENT) + +print_function = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_PRINT_FUNCTION) + +unicode_literals = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_UNICODE_LITERALS) + +barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2), + (3, 9, 0, "alpha", 0), + CO_FUTURE_BARRY_AS_BDFL) + +generator_stop = _Feature((3, 5, 0, "beta", 1), + (3, 7, 0, "alpha", 0), + CO_FUTURE_GENERATOR_STOP) diff --git a/flaskwebproject/FlaskWebProject1/Lib/_bootlocale.py b/flaskwebproject/FlaskWebProject1/Lib/_bootlocale.py new file mode 100644 index 0000000..4bccac1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/_bootlocale.py @@ -0,0 +1,34 @@ +"""A minimal subset of the locale module used at interpreter startup +(imported by the _io module), in order to reduce startup time. + +Don't import directly from third-party code; use the `locale` module instead! +""" + +import sys +import _locale + +if sys.platform.startswith("win"): + def getpreferredencoding(do_setlocale=True): + return _locale._getdefaultlocale()[1] +else: + try: + _locale.CODESET + except AttributeError: + def getpreferredencoding(do_setlocale=True): + # This path for legacy systems needs the more complex + # getdefaultlocale() function, import the full locale module. + import locale + return locale.getpreferredencoding(do_setlocale) + else: + def getpreferredencoding(do_setlocale=True): + assert not do_setlocale + result = _locale.nl_langinfo(_locale.CODESET) + if not result and sys.platform == 'darwin': + # nl_langinfo can return an empty string + # when the setting has an invalid value. + # Default to UTF-8 in that case because + # UTF-8 is the default charset on OSX and + # returning nothing will crash the + # interpreter. + result = 'UTF-8' + return result diff --git a/flaskwebproject/FlaskWebProject1/Lib/_collections_abc.py b/flaskwebproject/FlaskWebProject1/Lib/_collections_abc.py new file mode 100644 index 0000000..aafd430 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/_collections_abc.py @@ -0,0 +1,1011 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. + +Unit tests are in test_collections. +""" + +from abc import ABCMeta, abstractmethod +import sys + +__all__ = ["Awaitable", "Coroutine", + "AsyncIterable", "AsyncIterator", "AsyncGenerator", + "Hashable", "Iterable", "Iterator", "Generator", "Reversible", + "Sized", "Container", "Callable", "Collection", + "Set", "MutableSet", + "Mapping", "MutableMapping", + "MappingView", "KeysView", "ItemsView", "ValuesView", + "Sequence", "MutableSequence", + "ByteString", + ] + +# This module has been renamed from collections.abc to _collections_abc to +# speed up interpreter startup. Some of the types such as MutableMapping are +# required early but collections module imports a lot of other modules. +# See issue #19218 +__name__ = "collections.abc" + +# Private list of types that we want to register with the various ABCs +# so that they will pass tests like: +# it = iter(somebytearray) +# assert isinstance(it, Iterable) +# Note: in other implementations, these types might not be distinct +# and they may have their own implementation specific types that +# are not included on this list. +bytes_iterator = type(iter(b'')) +bytearray_iterator = type(iter(bytearray())) +#callable_iterator = ??? +dict_keyiterator = type(iter({}.keys())) +dict_valueiterator = type(iter({}.values())) +dict_itemiterator = type(iter({}.items())) +list_iterator = type(iter([])) +list_reverseiterator = type(iter(reversed([]))) +range_iterator = type(iter(range(0))) +longrange_iterator = type(iter(range(1 << 1000))) +set_iterator = type(iter(set())) +str_iterator = type(iter("")) +tuple_iterator = type(iter(())) +zip_iterator = type(iter(zip())) +## views ## +dict_keys = type({}.keys()) +dict_values = type({}.values()) +dict_items = type({}.items()) +## misc ## +mappingproxy = type(type.__dict__) +generator = type((lambda: (yield))()) +## coroutine ## +async def _coro(): pass +_coro = _coro() +coroutine = type(_coro) +_coro.close() # Prevent ResourceWarning +del _coro +## asynchronous generator ## +async def _ag(): yield +_ag = _ag() +async_generator = type(_ag) +del _ag + + +### ONE-TRICK PONIES ### + +def _check_methods(C, *methods): + mro = C.__mro__ + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + +class Hashable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __hash__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Hashable: + return _check_methods(C, "__hash__") + return NotImplemented + + +class Awaitable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __await__(self): + yield + + @classmethod + def __subclasshook__(cls, C): + if cls is Awaitable: + return _check_methods(C, "__await__") + return NotImplemented + + +class Coroutine(Awaitable): + + __slots__ = () + + @abstractmethod + def send(self, value): + """Send a value into the coroutine. + Return next yielded value or raise StopIteration. + """ + raise StopIteration + + @abstractmethod + def throw(self, typ, val=None, tb=None): + """Raise an exception in the coroutine. + Return next yielded value or raise StopIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + def close(self): + """Raise GeneratorExit inside coroutine. + """ + try: + self.throw(GeneratorExit) + except (GeneratorExit, StopIteration): + pass + else: + raise RuntimeError("coroutine ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is Coroutine: + return _check_methods(C, '__await__', 'send', 'throw', 'close') + return NotImplemented + + +Coroutine.register(coroutine) + + +class AsyncIterable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __aiter__(self): + return AsyncIterator() + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncIterable: + return _check_methods(C, "__aiter__") + return NotImplemented + + +class AsyncIterator(AsyncIterable): + + __slots__ = () + + @abstractmethod + async def __anext__(self): + """Return the next item or raise StopAsyncIteration when exhausted.""" + raise StopAsyncIteration + + def __aiter__(self): + return self + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncIterator: + return _check_methods(C, "__anext__", "__aiter__") + return NotImplemented + + +class AsyncGenerator(AsyncIterator): + + __slots__ = () + + async def __anext__(self): + """Return the next item from the asynchronous generator. + When exhausted, raise StopAsyncIteration. + """ + return await self.asend(None) + + @abstractmethod + async def asend(self, value): + """Send a value into the asynchronous generator. + Return next yielded value or raise StopAsyncIteration. + """ + raise StopAsyncIteration + + @abstractmethod + async def athrow(self, typ, val=None, tb=None): + """Raise an exception in the asynchronous generator. + Return next yielded value or raise StopAsyncIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + async def aclose(self): + """Raise GeneratorExit inside coroutine. + """ + try: + await self.athrow(GeneratorExit) + except (GeneratorExit, StopAsyncIteration): + pass + else: + raise RuntimeError("asynchronous generator ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncGenerator: + return _check_methods(C, '__aiter__', '__anext__', + 'asend', 'athrow', 'aclose') + return NotImplemented + + +AsyncGenerator.register(async_generator) + + +class Iterable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __iter__(self): + while False: + yield None + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterable: + return _check_methods(C, "__iter__") + return NotImplemented + + +class Iterator(Iterable): + + __slots__ = () + + @abstractmethod + def __next__(self): + 'Return the next item from the iterator. When exhausted, raise StopIteration' + raise StopIteration + + def __iter__(self): + return self + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterator: + return _check_methods(C, '__iter__', '__next__') + return NotImplemented + +Iterator.register(bytes_iterator) +Iterator.register(bytearray_iterator) +#Iterator.register(callable_iterator) +Iterator.register(dict_keyiterator) +Iterator.register(dict_valueiterator) +Iterator.register(dict_itemiterator) +Iterator.register(list_iterator) +Iterator.register(list_reverseiterator) +Iterator.register(range_iterator) +Iterator.register(longrange_iterator) +Iterator.register(set_iterator) +Iterator.register(str_iterator) +Iterator.register(tuple_iterator) +Iterator.register(zip_iterator) + + +class Reversible(Iterable): + + __slots__ = () + + @abstractmethod + def __reversed__(self): + while False: + yield None + + @classmethod + def __subclasshook__(cls, C): + if cls is Reversible: + return _check_methods(C, "__reversed__", "__iter__") + return NotImplemented + + +class Generator(Iterator): + + __slots__ = () + + def __next__(self): + """Return the next item from the generator. + When exhausted, raise StopIteration. + """ + return self.send(None) + + @abstractmethod + def send(self, value): + """Send a value into the generator. + Return next yielded value or raise StopIteration. + """ + raise StopIteration + + @abstractmethod + def throw(self, typ, val=None, tb=None): + """Raise an exception in the generator. + Return next yielded value or raise StopIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + def close(self): + """Raise GeneratorExit inside generator. + """ + try: + self.throw(GeneratorExit) + except (GeneratorExit, StopIteration): + pass + else: + raise RuntimeError("generator ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is Generator: + return _check_methods(C, '__iter__', '__next__', + 'send', 'throw', 'close') + return NotImplemented + +Generator.register(generator) + + +class Sized(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __len__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Sized: + return _check_methods(C, "__len__") + return NotImplemented + + +class Container(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __contains__(self, x): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Container: + return _check_methods(C, "__contains__") + return NotImplemented + +class Collection(Sized, Iterable, Container): + + __slots__ = () + + @classmethod + def __subclasshook__(cls, C): + if cls is Collection: + return _check_methods(C, "__len__", "__iter__", "__contains__") + return NotImplemented + +class Callable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __call__(self, *args, **kwds): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Callable: + return _check_methods(C, "__call__") + return NotImplemented + + +### SETS ### + + +class Set(Collection): + + """A set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__ and __len__. + + To override the comparisons (presumably for speed, as the + semantics are fixed), redefine __le__ and __ge__, + then the other operations will automatically follow suit. + """ + + __slots__ = () + + def __le__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) > len(other): + return False + for elem in self: + if elem not in other: + return False + return True + + def __lt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) < len(other) and self.__le__(other) + + def __gt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) > len(other) and self.__ge__(other) + + def __ge__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) < len(other): + return False + for elem in other: + if elem not in self: + return False + return True + + def __eq__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) == len(other) and self.__le__(other) + + @classmethod + def _from_iterable(cls, it): + '''Construct an instance of the class from any iterable input. + + Must override this method if the class constructor signature + does not accept an iterable for an input. + ''' + return cls(it) + + def __and__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + return self._from_iterable(value for value in other if value in self) + + __rand__ = __and__ + + def isdisjoint(self, other): + 'Return True if two sets have a null intersection.' + for value in other: + if value in self: + return False + return True + + def __or__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + chain = (e for s in (self, other) for e in s) + return self._from_iterable(chain) + + __ror__ = __or__ + + def __sub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in self + if value not in other) + + def __rsub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in other + if value not in self) + + def __xor__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return (self - other) | (other - self) + + __rxor__ = __xor__ + + def _hash(self): + """Compute the hash value of a set. + + Note that we don't define __hash__: not all sets are hashable. + But if you define a hashable set type, its __hash__ should + call this function. + + This must be compatible __eq__. + + All sets ought to compare equal if they contain the same + elements, regardless of how they are implemented, and + regardless of the order of the elements; so there's not much + freedom for __eq__ or __hash__. We match the algorithm used + by the built-in frozenset type. + """ + MAX = sys.maxsize + MASK = 2 * MAX + 1 + n = len(self) + h = 1927868237 * (n + 1) + h &= MASK + for x in self: + hx = hash(x) + h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 + h &= MASK + h = h * 69069 + 907133923 + h &= MASK + if h > MAX: + h -= MASK + 1 + if h == -1: + h = 590923713 + return h + +Set.register(frozenset) + + +class MutableSet(Set): + """A mutable set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__, __len__, + add(), and discard(). + + To override the comparisons (presumably for speed, as the + semantics are fixed), all you have to do is redefine __le__ and + then the other operations will automatically follow suit. + """ + + __slots__ = () + + @abstractmethod + def add(self, value): + """Add an element.""" + raise NotImplementedError + + @abstractmethod + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + raise NotImplementedError + + def remove(self, value): + """Remove an element. If not a member, raise a KeyError.""" + if value not in self: + raise KeyError(value) + self.discard(value) + + def pop(self): + """Return the popped value. Raise KeyError if empty.""" + it = iter(self) + try: + value = next(it) + except StopIteration: + raise KeyError + self.discard(value) + return value + + def clear(self): + """This is slow (creates N new iterators!) but effective.""" + try: + while True: + self.pop() + except KeyError: + pass + + def __ior__(self, it): + for value in it: + self.add(value) + return self + + def __iand__(self, it): + for value in (self - it): + self.discard(value) + return self + + def __ixor__(self, it): + if it is self: + self.clear() + else: + if not isinstance(it, Set): + it = self._from_iterable(it) + for value in it: + if value in self: + self.discard(value) + else: + self.add(value) + return self + + def __isub__(self, it): + if it is self: + self.clear() + else: + for value in it: + self.discard(value) + return self + +MutableSet.register(set) + + +### MAPPINGS ### + + +class Mapping(Collection): + + __slots__ = () + + """A Mapping is a generic container for associating key/value + pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __iter__, and __len__. + + """ + + @abstractmethod + def __getitem__(self, key): + raise KeyError + + def get(self, key, default=None): + 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return KeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return ItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return ValuesView(self) + + def __eq__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + return dict(self.items()) == dict(other.items()) + + __reversed__ = None + +Mapping.register(mappingproxy) + + +class MappingView(Sized): + + __slots__ = '_mapping', + + def __init__(self, mapping): + self._mapping = mapping + + def __len__(self): + return len(self._mapping) + + def __repr__(self): + return '{0.__class__.__name__}({0._mapping!r})'.format(self) + + +class KeysView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, key): + return key in self._mapping + + def __iter__(self): + yield from self._mapping + +KeysView.register(dict_keys) + + +class ItemsView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, item): + key, value = item + try: + v = self._mapping[key] + except KeyError: + return False + else: + return v is value or v == value + + def __iter__(self): + for key in self._mapping: + yield (key, self._mapping[key]) + +ItemsView.register(dict_items) + + +class ValuesView(MappingView): + + __slots__ = () + + def __contains__(self, value): + for key in self._mapping: + v = self._mapping[key] + if v is value or v == value: + return True + return False + + def __iter__(self): + for key in self._mapping: + yield self._mapping[key] + +ValuesView.register(dict_values) + + +class MutableMapping(Mapping): + + __slots__ = () + + """A MutableMapping is a generic container for associating + key/value pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __setitem__, __delitem__, + __iter__, and __len__. + + """ + + @abstractmethod + def __setitem__(self, key, value): + raise KeyError + + @abstractmethod + def __delitem__(self, key): + raise KeyError + + __marker = object() + + 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. + ''' + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def popitem(self): + '''D.popitem() -> (k, v), remove and return some (key, value) pair + as a 2-tuple; but raise KeyError if D is empty. + ''' + try: + key = next(iter(self)) + except StopIteration: + raise KeyError + value = self[key] + del self[key] + return key, value + + def clear(self): + 'D.clear() -> None. Remove all items from D.' + try: + while True: + self.popitem() + except KeyError: + pass + + def update(*args, **kwds): + ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. + If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v + In either case, this is followed by: for k, v in F.items(): D[k] = v + ''' + if not args: + raise TypeError("descriptor 'update' of 'MutableMapping' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('update expected at most 1 arguments, got %d' % + len(args)) + if args: + other = args[0] + if isinstance(other, Mapping): + 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 + + def setdefault(self, key, default=None): + 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' + try: + return self[key] + except KeyError: + self[key] = default + return default + +MutableMapping.register(dict) + + +### SEQUENCES ### + + +class Sequence(Reversible, Collection): + + """All the operations on a read-only sequence. + + Concrete subclasses must override __new__ or __init__, + __getitem__, and __len__. + """ + + __slots__ = () + + @abstractmethod + def __getitem__(self, index): + raise IndexError + + def __iter__(self): + i = 0 + try: + while True: + v = self[i] + yield v + i += 1 + except IndexError: + return + + def __contains__(self, value): + for v in self: + if v is value or v == value: + return True + return False + + def __reversed__(self): + for i in reversed(range(len(self))): + yield self[i] + + def index(self, value, start=0, stop=None): + '''S.index(value, [start, [stop]]) -> integer -- return first index of value. + Raises ValueError if the value is not present. + + Supporting start and stop arguments is optional, but + recommended. + ''' + if start is not None and start < 0: + start = max(len(self) + start, 0) + if stop is not None and stop < 0: + stop += len(self) + + i = start + while stop is None or i < stop: + try: + v = self[i] + if v is value or v == value: + return i + except IndexError: + break + i += 1 + raise ValueError + + def count(self, value): + 'S.count(value) -> integer -- return number of occurrences of value' + return sum(1 for v in self if v is value or v == value) + +Sequence.register(tuple) +Sequence.register(str) +Sequence.register(range) +Sequence.register(memoryview) + + +class ByteString(Sequence): + + """This unifies bytes and bytearray. + + XXX Should add all their methods. + """ + + __slots__ = () + +ByteString.register(bytes) +ByteString.register(bytearray) + + +class MutableSequence(Sequence): + + __slots__ = () + + """All the operations on a read-write sequence. + + Concrete subclasses must provide __new__ or __init__, + __getitem__, __setitem__, __delitem__, __len__, and insert(). + + """ + + @abstractmethod + def __setitem__(self, index, value): + raise IndexError + + @abstractmethod + def __delitem__(self, index): + raise IndexError + + @abstractmethod + def insert(self, index, value): + 'S.insert(index, value) -- insert value before index' + raise IndexError + + def append(self, value): + 'S.append(value) -- append value to the end of the sequence' + self.insert(len(self), value) + + def clear(self): + 'S.clear() -> None -- remove all items from S' + try: + while True: + self.pop() + except IndexError: + pass + + def reverse(self): + 'S.reverse() -- reverse *IN PLACE*' + n = len(self) + for i in range(n//2): + self[i], self[n-i-1] = self[n-i-1], self[i] + + def extend(self, values): + 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + for v in values: + self.append(v) + + def pop(self, index=-1): + '''S.pop([index]) -> item -- remove and return item at index (default last). + Raise IndexError if list is empty or index is out of range. + ''' + v = self[index] + del self[index] + return v + + def remove(self, value): + '''S.remove(value) -- remove first occurrence of value. + Raise ValueError if the value is not present. + ''' + del self[self.index(value)] + + def __iadd__(self, values): + self.extend(values) + return self + +MutableSequence.register(list) +MutableSequence.register(bytearray) # Multiply inheriting, see ByteString diff --git a/flaskwebproject/FlaskWebProject1/Lib/_dummy_thread.py b/flaskwebproject/FlaskWebProject1/Lib/_dummy_thread.py new file mode 100644 index 0000000..36e5f38 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/_dummy_thread.py @@ -0,0 +1,163 @@ +"""Drop-in replacement for the thread module. + +Meant to be used as a brain-dead substitute so that threaded code does +not need to be rewritten for when the thread module is not present. + +Suggested usage is:: + + try: + import _thread + except ImportError: + import _dummy_thread as _thread + +""" +# Exports only things specified by thread documentation; +# skipping obsolete synonyms allocate(), start_new(), exit_thread(). +__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', + 'interrupt_main', 'LockType'] + +# A dummy value +TIMEOUT_MAX = 2**31 + +# NOTE: this module can be imported early in the extension building process, +# and so top level imports of other modules should be avoided. Instead, all +# imports are done when needed on a function-by-function basis. Since threads +# are disabled, the import lock should not be an issue anyway (??). + +error = RuntimeError + +def start_new_thread(function, args, kwargs={}): + """Dummy implementation of _thread.start_new_thread(). + + Compatibility is maintained by making sure that ``args`` is a + tuple and ``kwargs`` is a dictionary. If an exception is raised + and it is SystemExit (which can be done by _thread.exit()) it is + caught and nothing is done; all other exceptions are printed out + by using traceback.print_exc(). + + If the executed function calls interrupt_main the KeyboardInterrupt will be + raised when the function returns. + + """ + if type(args) != type(tuple()): + raise TypeError("2nd arg must be a tuple") + if type(kwargs) != type(dict()): + raise TypeError("3rd arg must be a dict") + global _main + _main = False + try: + function(*args, **kwargs) + except SystemExit: + pass + except: + import traceback + traceback.print_exc() + _main = True + global _interrupt + if _interrupt: + _interrupt = False + raise KeyboardInterrupt + +def exit(): + """Dummy implementation of _thread.exit().""" + raise SystemExit + +def get_ident(): + """Dummy implementation of _thread.get_ident(). + + Since this module should only be used when _threadmodule is not + available, it is safe to assume that the current process is the + only thread. Thus a constant can be safely returned. + """ + return -1 + +def allocate_lock(): + """Dummy implementation of _thread.allocate_lock().""" + return LockType() + +def stack_size(size=None): + """Dummy implementation of _thread.stack_size().""" + if size is not None: + raise error("setting thread stack size not supported") + return 0 + +def _set_sentinel(): + """Dummy implementation of _thread._set_sentinel().""" + return LockType() + +class LockType(object): + """Class implementing dummy implementation of _thread.LockType. + + Compatibility is maintained by maintaining self.locked_status + which is a boolean that stores the state of the lock. Pickling of + the lock, though, should not be done since if the _thread module is + then used with an unpickled ``lock()`` from here problems could + occur from this class not having atomic methods. + + """ + + def __init__(self): + self.locked_status = False + + def acquire(self, waitflag=None, timeout=-1): + """Dummy implementation of acquire(). + + For blocking calls, self.locked_status is automatically set to + True and returned appropriately based on value of + ``waitflag``. If it is non-blocking, then the value is + actually checked and not set if it is already acquired. This + is all done so that threading.Condition's assert statements + aren't triggered and throw a little fit. + + """ + if waitflag is None or waitflag: + self.locked_status = True + return True + else: + if not self.locked_status: + self.locked_status = True + return True + else: + if timeout > 0: + import time + time.sleep(timeout) + return False + + __enter__ = acquire + + def __exit__(self, typ, val, tb): + self.release() + + def release(self): + """Release the dummy lock.""" + # XXX Perhaps shouldn't actually bother to test? Could lead + # to problems for complex, threaded code. + if not self.locked_status: + raise error + self.locked_status = False + return True + + def locked(self): + return self.locked_status + + def __repr__(self): + return "<%s %s.%s object at %s>" % ( + "locked" if self.locked_status else "unlocked", + self.__class__.__module__, + self.__class__.__qualname__, + hex(id(self)) + ) + +# Used to signal that interrupt_main was called in a "thread" +_interrupt = False +# True when not executing in a "thread" +_main = True + +def interrupt_main(): + """Set _interrupt flag to True to have start_new_thread raise + KeyboardInterrupt upon exiting.""" + if _main: + raise KeyboardInterrupt + else: + global _interrupt + _interrupt = True diff --git a/flaskwebproject/FlaskWebProject1/Lib/_weakrefset.py b/flaskwebproject/FlaskWebProject1/Lib/_weakrefset.py new file mode 100644 index 0000000..7f9923c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/_weakrefset.py @@ -0,0 +1,196 @@ +# Access WeakSet through the weakref module. +# This code is separated-out because it is needed +# by abc.py to load everything else at startup. + +from _weakref import ref + +__all__ = ['WeakSet'] + + +class _IterationGuard: + # This context manager registers itself in the current iterators of the + # weak container, such as to delay all removals until the context manager + # exits. + # This technique should be relatively thread-safe (since sets are). + + def __init__(self, weakcontainer): + # Don't create cycles + self.weakcontainer = ref(weakcontainer) + + def __enter__(self): + w = self.weakcontainer() + if w is not None: + w._iterating.add(self) + return self + + def __exit__(self, e, t, b): + w = self.weakcontainer() + if w is not None: + s = w._iterating + s.remove(self) + if not s: + w._commit_removals() + + +class WeakSet: + def __init__(self, data=None): + self.data = set() + def _remove(item, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(item) + else: + self.data.discard(item) + self._remove = _remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + if data is not None: + self.update(data) + + def _commit_removals(self): + l = self._pending_removals + discard = self.data.discard + while l: + discard(l.pop()) + + def __iter__(self): + with _IterationGuard(self): + for itemref in self.data: + item = itemref() + if item is not None: + # Caveat: the iterator will keep a strong reference to + # `item` until it is resumed or closed. + yield item + + def __len__(self): + return len(self.data) - len(self._pending_removals) + + def __contains__(self, item): + try: + wr = ref(item) + except TypeError: + return False + return wr in self.data + + def __reduce__(self): + return (self.__class__, (list(self),), + getattr(self, '__dict__', None)) + + def add(self, item): + if self._pending_removals: + self._commit_removals() + self.data.add(ref(item, self._remove)) + + def clear(self): + if self._pending_removals: + self._commit_removals() + self.data.clear() + + def copy(self): + return self.__class__(self) + + def pop(self): + if self._pending_removals: + self._commit_removals() + while True: + try: + itemref = self.data.pop() + except KeyError: + raise KeyError('pop from empty WeakSet') + item = itemref() + if item is not None: + return item + + def remove(self, item): + if self._pending_removals: + self._commit_removals() + self.data.remove(ref(item)) + + def discard(self, item): + if self._pending_removals: + self._commit_removals() + self.data.discard(ref(item)) + + def update(self, other): + if self._pending_removals: + self._commit_removals() + for element in other: + self.add(element) + + def __ior__(self, other): + self.update(other) + return self + + def difference(self, other): + newset = self.copy() + newset.difference_update(other) + return newset + __sub__ = difference + + def difference_update(self, other): + self.__isub__(other) + def __isub__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.difference_update(ref(item) for item in other) + return self + + def intersection(self, other): + return self.__class__(item for item in other if item in self) + __and__ = intersection + + def intersection_update(self, other): + self.__iand__(other) + def __iand__(self, other): + if self._pending_removals: + self._commit_removals() + self.data.intersection_update(ref(item) for item in other) + return self + + def issubset(self, other): + return self.data.issubset(ref(item) for item in other) + __le__ = issubset + + def __lt__(self, other): + return self.data < set(ref(item) for item in other) + + def issuperset(self, other): + return self.data.issuperset(ref(item) for item in other) + __ge__ = issuperset + + def __gt__(self, other): + return self.data > set(ref(item) for item in other) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.data == set(ref(item) for item in other) + + def symmetric_difference(self, other): + newset = self.copy() + newset.symmetric_difference_update(other) + return newset + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + self.__ixor__(other) + def __ixor__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.symmetric_difference_update(ref(item, self._remove) for item in other) + return self + + def union(self, other): + return self.__class__(e for s in (self, other) for e in s) + __or__ = union + + def isdisjoint(self, other): + return len(self.intersection(other)) == 0 diff --git a/flaskwebproject/FlaskWebProject1/Lib/abc.py b/flaskwebproject/FlaskWebProject1/Lib/abc.py new file mode 100644 index 0000000..a092db2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/abc.py @@ -0,0 +1,250 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) according to PEP 3119.""" + +from _weakrefset import WeakSet + + +def abstractmethod(funcobj): + """A decorator indicating abstract methods. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract methods are overridden. + The abstract methods can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractmethod + def my_abstract_method(self, ...): + ... + """ + funcobj.__isabstractmethod__ = True + return funcobj + + +class abstractclassmethod(classmethod): + """ + A decorator indicating abstract classmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractclassmethod + def my_abstract_classmethod(cls, ...): + ... + + 'abstractclassmethod' is deprecated. Use 'classmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractstaticmethod(staticmethod): + """ + A decorator indicating abstract staticmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractstaticmethod + def my_abstract_staticmethod(...): + ... + + 'abstractstaticmethod' is deprecated. Use 'staticmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractproperty(property): + """ + A decorator indicating abstract properties. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract properties are overridden. + The abstract properties can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractproperty + def my_abstract_property(self): + ... + + This defines a read-only property; you can also define a read-write + abstract property using the 'long' form of property declaration: + + class C(metaclass=ABCMeta): + def getx(self): ... + def setx(self, value): ... + x = abstractproperty(getx, setx) + + 'abstractproperty' is deprecated. Use 'property' with 'abstractmethod' + instead. + """ + + __isabstractmethod__ = True + + +class ABCMeta(type): + + """Metaclass for defining Abstract Base Classes (ABCs). + + Use this metaclass to create an ABC. An ABC can be subclassed + directly, and then acts as a mix-in class. You can also register + unrelated concrete classes (even built-in classes) and unrelated + ABCs as 'virtual subclasses' -- these and their descendants will + be considered subclasses of the registering ABC by the built-in + issubclass() function, but the registering ABC won't show up in + their MRO (Method Resolution Order) nor will method + implementations defined by the registering ABC be callable (not + even via super()). + + """ + + # A global counter that is incremented each time a class is + # registered as a virtual subclass of anything. It forces the + # negative cache to be cleared before its next use. + # Note: this counter is private. Use `abc.get_cache_token()` for + # external code. + _abc_invalidation_counter = 0 + + def __new__(mcls, name, bases, namespace, **kwargs): + cls = super().__new__(mcls, name, bases, namespace, **kwargs) + # Compute set of abstract method names + abstracts = {name + for name, value in namespace.items() + if getattr(value, "__isabstractmethod__", False)} + for base in bases: + for name in getattr(base, "__abstractmethods__", set()): + value = getattr(cls, name, None) + if getattr(value, "__isabstractmethod__", False): + abstracts.add(name) + cls.__abstractmethods__ = frozenset(abstracts) + # Set up inheritance registry + cls._abc_registry = WeakSet() + cls._abc_cache = WeakSet() + cls._abc_negative_cache = WeakSet() + cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter + return cls + + def register(cls, subclass): + """Register a virtual subclass of an ABC. + + Returns the subclass, to allow usage as a class decorator. + """ + if not isinstance(subclass, type): + raise TypeError("Can only register classes") + if issubclass(subclass, cls): + return subclass # Already a subclass + # Subtle: test for cycles *after* testing for "already a subclass"; + # this means we allow X.register(X) and interpret it as a no-op. + if issubclass(cls, subclass): + # This would create a cycle, which is bad for the algorithm below + raise RuntimeError("Refusing to create an inheritance cycle") + cls._abc_registry.add(subclass) + ABCMeta._abc_invalidation_counter += 1 # Invalidate negative cache + return subclass + + def _dump_registry(cls, file=None): + """Debug helper to print the ABC registry.""" + print("Class: %s.%s" % (cls.__module__, cls.__qualname__), file=file) + print("Inv.counter: %s" % ABCMeta._abc_invalidation_counter, file=file) + for name in sorted(cls.__dict__): + if name.startswith("_abc_"): + value = getattr(cls, name) + if isinstance(value, WeakSet): + value = set(value) + print("%s: %r" % (name, value), file=file) + + def __instancecheck__(cls, instance): + """Override for isinstance(instance, cls).""" + # Inline the cache checking + subclass = instance.__class__ + if subclass in cls._abc_cache: + return True + subtype = type(instance) + if subtype is subclass: + if (cls._abc_negative_cache_version == + ABCMeta._abc_invalidation_counter and + subclass in cls._abc_negative_cache): + return False + # Fall back to the subclass check. + return cls.__subclasscheck__(subclass) + return any(cls.__subclasscheck__(c) for c in {subclass, subtype}) + + def __subclasscheck__(cls, subclass): + """Override for issubclass(subclass, cls).""" + # Check cache + if subclass in cls._abc_cache: + return True + # Check negative cache; may have to invalidate + if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter: + # Invalidate the negative cache + cls._abc_negative_cache = WeakSet() + cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter + elif subclass in cls._abc_negative_cache: + return False + # Check the subclass hook + ok = cls.__subclasshook__(subclass) + if ok is not NotImplemented: + assert isinstance(ok, bool) + if ok: + cls._abc_cache.add(subclass) + else: + cls._abc_negative_cache.add(subclass) + return ok + # Check if it's a direct subclass + if cls in getattr(subclass, '__mro__', ()): + cls._abc_cache.add(subclass) + return True + # Check if it's a subclass of a registered class (recursive) + for rcls in cls._abc_registry: + if issubclass(subclass, rcls): + cls._abc_cache.add(subclass) + return True + # Check if it's a subclass of a subclass (recursive) + for scls in cls.__subclasses__(): + if issubclass(subclass, scls): + cls._abc_cache.add(subclass) + return True + # No dice; update negative cache + cls._abc_negative_cache.add(subclass) + return False + + +class ABC(metaclass=ABCMeta): + """Helper class that provides a standard way to create an ABC using + inheritance. + """ + pass + + +def get_cache_token(): + """Returns the current ABC cache token. + + The token is an opaque object (supporting equality testing) identifying the + current version of the ABC cache for virtual subclasses. The token changes + with every call to ``register()`` on any ABC. + """ + return ABCMeta._abc_invalidation_counter diff --git a/flaskwebproject/FlaskWebProject1/Lib/base64.py b/flaskwebproject/FlaskWebProject1/Lib/base64.py new file mode 100644 index 0000000..eb8f258 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/base64.py @@ -0,0 +1,602 @@ +#! /usr/bin/env python3 + +"""Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings""" + +# Modified 04-Oct-1995 by Jack Jansen to use binascii module +# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support +# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere + +import re +import struct +import binascii + + +__all__ = [ + # Legacy interface exports traditional RFC 2045 Base64 encodings + 'encode', 'decode', 'encodebytes', 'decodebytes', + # Generalized interface for other encodings + 'b64encode', 'b64decode', 'b32encode', 'b32decode', + 'b16encode', 'b16decode', + # Base85 and Ascii85 encodings + 'b85encode', 'b85decode', 'a85encode', 'a85decode', + # Standard Base64 encoding + 'standard_b64encode', 'standard_b64decode', + # Some common Base64 alternatives. As referenced by RFC 3458, see thread + # starting at: + # + # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html + 'urlsafe_b64encode', 'urlsafe_b64decode', + ] + + +bytes_types = (bytes, bytearray) # Types acceptable as binary data + +def _bytes_from_decode_data(s): + if isinstance(s, str): + try: + return s.encode('ascii') + except UnicodeEncodeError: + raise ValueError('string argument should contain only ASCII characters') + if isinstance(s, bytes_types): + return s + try: + return memoryview(s).tobytes() + except TypeError: + raise TypeError("argument should be a bytes-like object or ASCII " + "string, not %r" % s.__class__.__name__) from None + + +# Base64 encoding/decoding uses binascii + +def b64encode(s, altchars=None): + """Encode the bytes-like object s using Base64 and return a bytes object. + + Optional altchars should be a byte string of length 2 which specifies an + alternative alphabet for the '+' and '/' characters. This allows an + application to e.g. generate url or filesystem safe Base64 strings. + """ + encoded = binascii.b2a_base64(s, newline=False) + if altchars is not None: + assert len(altchars) == 2, repr(altchars) + return encoded.translate(bytes.maketrans(b'+/', altchars)) + return encoded + + +def b64decode(s, altchars=None, validate=False): + """Decode the Base64 encoded bytes-like object or ASCII string s. + + Optional altchars must be a bytes-like object or ASCII string of length 2 + which specifies the alternative alphabet used instead of the '+' and '/' + characters. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded. + + If validate is False (the default), characters that are neither in the + normal base-64 alphabet nor the alternative alphabet are discarded prior + to the padding check. If validate is True, these non-alphabet characters + in the input result in a binascii.Error. + """ + s = _bytes_from_decode_data(s) + if altchars is not None: + altchars = _bytes_from_decode_data(altchars) + assert len(altchars) == 2, repr(altchars) + s = s.translate(bytes.maketrans(altchars, b'+/')) + if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + raise binascii.Error('Non-base64 digit found') + return binascii.a2b_base64(s) + + +def standard_b64encode(s): + """Encode bytes-like object s using the standard Base64 alphabet. + + The result is returned as a bytes object. + """ + return b64encode(s) + +def standard_b64decode(s): + """Decode bytes encoded with the standard Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the standard alphabet + are discarded prior to the padding check. + """ + return b64decode(s) + + +_urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_') +_urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/') + +def urlsafe_b64encode(s): + """Encode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object to encode. The result is returned as a + bytes object. The alphabet uses '-' instead of '+' and '_' instead of + '/'. + """ + return b64encode(s).translate(_urlsafe_encode_translation) + +def urlsafe_b64decode(s): + """Decode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the URL-safe base-64 + alphabet, and are not a plus '+' or slash '/', are discarded prior to the + padding check. + + The alphabet uses '-' instead of '+' and '_' instead of '/'. + """ + s = _bytes_from_decode_data(s) + s = s.translate(_urlsafe_decode_translation) + return b64decode(s) + + + +# Base32 encoding/decoding must be done in Python +_b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' +_b32tab2 = None +_b32rev = None + +def b32encode(s): + """Encode the bytes-like object s using Base32 and return a bytes object. + """ + global _b32tab2 + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32tab2 is None: + b32tab = [bytes((i,)) for i in _b32alphabet] + _b32tab2 = [a + b for a in b32tab for b in b32tab] + b32tab = None + + if not isinstance(s, bytes_types): + s = memoryview(s).tobytes() + leftover = len(s) % 5 + # Pad the last quantum with zero bits if necessary + if leftover: + s = s + b'\0' * (5 - leftover) # Don't use += ! + encoded = bytearray() + from_bytes = int.from_bytes + b32tab2 = _b32tab2 + for i in range(0, len(s), 5): + c = from_bytes(s[i: i + 5], 'big') + encoded += (b32tab2[c >> 30] + # bits 1 - 10 + b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20 + b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30 + b32tab2[c & 0x3ff] # bits 31 - 40 + ) + # Adjust for any leftover partial quanta + if leftover == 1: + encoded[-6:] = b'======' + elif leftover == 2: + encoded[-4:] = b'====' + elif leftover == 3: + encoded[-3:] = b'===' + elif leftover == 4: + encoded[-1:] = b'=' + return bytes(encoded) + +def b32decode(s, casefold=False, map01=None): + """Decode the Base32 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + RFC 3548 allows for optional mapping of the digit 0 (zero) to the + letter O (oh), and for optional mapping of the digit 1 (one) to + either the letter I (eye) or letter L (el). The optional argument + map01 when not None, specifies which letter the digit 1 should be + mapped to (when map01 is not None, the digit 0 is always mapped to + the letter O). For security purposes the default is None, so that + 0 and 1 are not allowed in the input. + + The result is returned as a bytes object. A binascii.Error is raised if + the input is incorrectly padded or if there are non-alphabet + characters present in the input. + """ + global _b32rev + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32rev is None: + _b32rev = {v: k for k, v in enumerate(_b32alphabet)} + s = _bytes_from_decode_data(s) + if len(s) % 8: + raise binascii.Error('Incorrect padding') + # Handle section 2.4 zero and one mapping. The flag map01 will be either + # False, or the character to map the digit 1 (one) to. It should be + # either L (el) or I (eye). + if map01 is not None: + map01 = _bytes_from_decode_data(map01) + assert len(map01) == 1, repr(map01) + s = s.translate(bytes.maketrans(b'01', b'O' + map01)) + if casefold: + s = s.upper() + # Strip off pad characters from the right. We need to count the pad + # characters because this will tell us how many null bytes to remove from + # the end of the decoded string. + l = len(s) + s = s.rstrip(b'=') + padchars = l - len(s) + # Now decode the full quanta + decoded = bytearray() + b32rev = _b32rev + for i in range(0, len(s), 8): + quanta = s[i: i + 8] + acc = 0 + try: + for c in quanta: + acc = (acc << 5) + b32rev[c] + except KeyError: + raise binascii.Error('Non-base32 digit found') from None + decoded += acc.to_bytes(5, 'big') + # Process the last, partial quanta + if padchars: + acc <<= 5 * padchars + last = acc.to_bytes(5, 'big') + if padchars == 1: + decoded[-5:] = last[:-1] + elif padchars == 3: + decoded[-5:] = last[:-2] + elif padchars == 4: + decoded[-5:] = last[:-3] + elif padchars == 6: + decoded[-5:] = last[:-4] + else: + raise binascii.Error('Incorrect padding') + return bytes(decoded) + + + +# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns +# lowercase. The RFC also recommends against accepting input case +# insensitively. +def b16encode(s): + """Encode the bytes-like object s using Base16 and return a bytes object. + """ + return binascii.hexlify(s).upper() + + +def b16decode(s, casefold=False): + """Decode the Base16 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded or if there are non-alphabet characters present + in the input. + """ + s = _bytes_from_decode_data(s) + if casefold: + s = s.upper() + if re.search(b'[^0-9A-F]', s): + raise binascii.Error('Non-base16 digit found') + return binascii.unhexlify(s) + +# +# Ascii85 encoding/decoding +# + +_a85chars = None +_a85chars2 = None +_A85START = b"<~" +_A85END = b"~>" + +def _85encode(b, chars, chars2, pad=False, foldnuls=False, foldspaces=False): + # Helper function for a85encode and b85encode + if not isinstance(b, bytes_types): + b = memoryview(b).tobytes() + + padding = (-len(b)) % 4 + if padding: + b = b + b'\0' * padding + words = struct.Struct('!%dI' % (len(b) // 4)).unpack(b) + + chunks = [b'z' if foldnuls and not word else + b'y' if foldspaces and word == 0x20202020 else + (chars2[word // 614125] + + chars2[word // 85 % 7225] + + chars[word % 85]) + for word in words] + + if padding and not pad: + if chunks[-1] == b'z': + chunks[-1] = chars[0] * 5 + chunks[-1] = chunks[-1][:-padding] + + return b''.join(chunks) + +def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): + """Encode bytes-like object b using Ascii85 and return a bytes object. + + foldspaces is an optional flag that uses the special short sequence 'y' + instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This + feature is not supported by the "standard" Adobe encoding. + + wrapcol controls whether the output should have newline (b'\\n') characters + added to it. If this is non-zero, each output line will be at most this + many characters long. + + pad controls whether the input is padded to a multiple of 4 before + encoding. Note that the btoa implementation always pads. + + adobe controls whether the encoded byte sequence is framed with <~ and ~>, + which is used by the Adobe implementation. + """ + global _a85chars, _a85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _a85chars is None: + _a85chars = [bytes((i,)) for i in range(33, 118)] + _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars] + + result = _85encode(b, _a85chars, _a85chars2, pad, True, foldspaces) + + if adobe: + result = _A85START + result + if wrapcol: + wrapcol = max(2 if adobe else 1, wrapcol) + chunks = [result[i: i + wrapcol] + for i in range(0, len(result), wrapcol)] + if adobe: + if len(chunks[-1]) + 2 > wrapcol: + chunks.append(b'') + result = b'\n'.join(chunks) + if adobe: + result += _A85END + + return result + +def a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v'): + """Decode the Ascii85 encoded bytes-like object or ASCII string b. + + foldspaces is a flag that specifies whether the 'y' short sequence should be + accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is + not supported by the "standard" Adobe encoding. + + adobe controls whether the input sequence is in Adobe Ascii85 format (i.e. + is framed with <~ and ~>). + + ignorechars should be a byte string containing characters to ignore from the + input. This should only contain whitespace characters, and by default + contains all whitespace characters in ASCII. + + The result is returned as a bytes object. + """ + b = _bytes_from_decode_data(b) + if adobe: + if not b.endswith(_A85END): + raise ValueError( + "Ascii85 encoded byte sequences must end " + "with {!r}".format(_A85END) + ) + if b.startswith(_A85START): + b = b[2:-2] # Strip off start/end markers + else: + b = b[:-2] + # + # We have to go through this stepwise, so as to ignore spaces and handle + # special short sequences + # + packI = struct.Struct('!I').pack + decoded = [] + decoded_append = decoded.append + curr = [] + curr_append = curr.append + curr_clear = curr.clear + for x in b + b'u' * 4: + if b'!'[0] <= x <= b'u'[0]: + curr_append(x) + if len(curr) == 5: + acc = 0 + for x in curr: + acc = 85 * acc + (x - 33) + try: + decoded_append(packI(acc)) + except struct.error: + raise ValueError('Ascii85 overflow') from None + curr_clear() + elif x == b'z'[0]: + if curr: + raise ValueError('z inside Ascii85 5-tuple') + decoded_append(b'\0\0\0\0') + elif foldspaces and x == b'y'[0]: + if curr: + raise ValueError('y inside Ascii85 5-tuple') + decoded_append(b'\x20\x20\x20\x20') + elif x in ignorechars: + # Skip whitespace + continue + else: + raise ValueError('Non-Ascii85 digit found: %c' % x) + + result = b''.join(decoded) + padding = 4 - len(curr) + if padding: + # Throw away the extra padding + result = result[:-padding] + return result + +# The following code is originally taken (with permission) from Mercurial + +_b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") +_b85chars = None +_b85chars2 = None +_b85dec = None + +def b85encode(b, pad=False): + """Encode bytes-like object b in base85 format and return a bytes object. + + If pad is true, the input is padded with b'\\0' so its length is a multiple of + 4 bytes before encoding. + """ + global _b85chars, _b85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85chars is None: + _b85chars = [bytes((i,)) for i in _b85alphabet] + _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars] + return _85encode(b, _b85chars, _b85chars2, pad) + +def b85decode(b): + """Decode the base85-encoded bytes-like object or ASCII string b + + The result is returned as a bytes object. + """ + global _b85dec + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85dec is None: + _b85dec = [None] * 256 + for i, c in enumerate(_b85alphabet): + _b85dec[c] = i + + b = _bytes_from_decode_data(b) + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in chunk: + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(chunk): + if _b85dec[c] is None: + raise ValueError('bad base85 character at position %d' + % (i + j)) from None + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) from None + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + +# Legacy interface. This code could be cleaned up since I don't believe +# binascii has any line length limitations. It just doesn't seem worth it +# though. The files should be opened in binary mode. + +MAXLINESIZE = 76 # Excluding the CRLF +MAXBINSIZE = (MAXLINESIZE//4)*3 + +def encode(input, output): + """Encode a file; input and output are binary files.""" + while True: + s = input.read(MAXBINSIZE) + if not s: + break + while len(s) < MAXBINSIZE: + ns = input.read(MAXBINSIZE-len(s)) + if not ns: + break + s += ns + line = binascii.b2a_base64(s) + output.write(line) + + +def decode(input, output): + """Decode a file; input and output are binary files.""" + while True: + line = input.readline() + if not line: + break + s = binascii.a2b_base64(line) + output.write(s) + +def _input_type_check(s): + try: + m = memoryview(s) + except TypeError as err: + msg = "expected bytes-like object, not %s" % s.__class__.__name__ + raise TypeError(msg) from err + if m.format not in ('c', 'b', 'B'): + msg = ("expected single byte elements, not %r from %s" % + (m.format, s.__class__.__name__)) + raise TypeError(msg) + if m.ndim != 1: + msg = ("expected 1-D data, not %d-D data from %s" % + (m.ndim, s.__class__.__name__)) + raise TypeError(msg) + + +def encodebytes(s): + """Encode a bytestring into a bytes object containing multiple lines + of base-64 data.""" + _input_type_check(s) + pieces = [] + for i in range(0, len(s), MAXBINSIZE): + chunk = s[i : i + MAXBINSIZE] + pieces.append(binascii.b2a_base64(chunk)) + return b"".join(pieces) + +def encodestring(s): + """Legacy alias of encodebytes().""" + import warnings + warnings.warn("encodestring() is a deprecated alias since 3.1, " + "use encodebytes()", + DeprecationWarning, 2) + return encodebytes(s) + + +def decodebytes(s): + """Decode a bytestring of base-64 data into a bytes object.""" + _input_type_check(s) + return binascii.a2b_base64(s) + +def decodestring(s): + """Legacy alias of decodebytes().""" + import warnings + warnings.warn("decodestring() is a deprecated alias since Python 3.1, " + "use decodebytes()", + DeprecationWarning, 2) + return decodebytes(s) + + +# Usable as a script... +def main(): + """Small main program""" + import sys, getopt + try: + opts, args = getopt.getopt(sys.argv[1:], 'deut') + except getopt.error as msg: + sys.stdout = sys.stderr + print(msg) + print("""usage: %s [-d|-e|-u|-t] [file|-] + -d, -u: decode + -e: encode (default) + -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) + sys.exit(2) + func = encode + for o, a in opts: + if o == '-e': func = encode + if o == '-d': func = decode + if o == '-u': func = decode + if o == '-t': test(); return + if args and args[0] != '-': + with open(args[0], 'rb') as f: + func(f, sys.stdout.buffer) + else: + func(sys.stdin.buffer, sys.stdout.buffer) + + +def test(): + s0 = b"Aladdin:open sesame" + print(repr(s0)) + s1 = encodebytes(s0) + print(repr(s1)) + s2 = decodebytes(s1) + print(repr(s2)) + assert s0 == s2 + + +if __name__ == '__main__': + main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/bisect.py b/flaskwebproject/FlaskWebProject1/Lib/bisect.py new file mode 100644 index 0000000..4a4d052 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/bisect.py @@ -0,0 +1,92 @@ +"""Bisection algorithms.""" + +def insort_right(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + a.insert(lo, x) + +insort = insort_right # backward compatibility + +def bisect_right(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e <= x, and all e in + a[i:] have e > x. So if x already appears in the list, a.insert(x) will + insert just after the rightmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + return lo + +bisect = bisect_right # backward compatibility + +def insort_left(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the left of the leftmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + a.insert(lo, x) + + +def bisect_left(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e < x, and all e in + a[i:] have e >= x. So if x already appears in the list, a.insert(x) will + insert just before the leftmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + return lo + +# Overwrite above definitions with a fast C implementation +try: + from _bisect import * +except ImportError: + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/codecs.py b/flaskwebproject/FlaskWebProject1/Lib/codecs.py new file mode 100644 index 0000000..fd6c6f5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/codecs.py @@ -0,0 +1,1113 @@ +""" codecs -- Python Codec Registry, API and helpers. + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import builtins, sys + +### Registry and builtin stateless codec functions + +try: + from _codecs import * +except ImportError as why: + raise SystemError('Failed to load the builtin codecs: %s' % why) + +__all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", + "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE", + "BOM_UTF8", "BOM_UTF16", "BOM_UTF16_LE", "BOM_UTF16_BE", + "BOM_UTF32", "BOM_UTF32_LE", "BOM_UTF32_BE", + "CodecInfo", "Codec", "IncrementalEncoder", "IncrementalDecoder", + "StreamReader", "StreamWriter", + "StreamReaderWriter", "StreamRecoder", + "getencoder", "getdecoder", "getincrementalencoder", + "getincrementaldecoder", "getreader", "getwriter", + "encode", "decode", "iterencode", "iterdecode", + "strict_errors", "ignore_errors", "replace_errors", + "xmlcharrefreplace_errors", + "backslashreplace_errors", "namereplace_errors", + "register_error", "lookup_error"] + +### Constants + +# +# Byte Order Mark (BOM = ZERO WIDTH NO-BREAK SPACE = U+FEFF) +# and its possible byte string values +# for UTF8/UTF16/UTF32 output and little/big endian machines +# + +# UTF-8 +BOM_UTF8 = b'\xef\xbb\xbf' + +# UTF-16, little endian +BOM_LE = BOM_UTF16_LE = b'\xff\xfe' + +# UTF-16, big endian +BOM_BE = BOM_UTF16_BE = b'\xfe\xff' + +# UTF-32, little endian +BOM_UTF32_LE = b'\xff\xfe\x00\x00' + +# UTF-32, big endian +BOM_UTF32_BE = b'\x00\x00\xfe\xff' + +if sys.byteorder == 'little': + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_LE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_LE + +else: + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_BE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_BE + +# Old broken names (don't use in new code) +BOM32_LE = BOM_UTF16_LE +BOM32_BE = BOM_UTF16_BE +BOM64_LE = BOM_UTF32_LE +BOM64_BE = BOM_UTF32_BE + + +### Codec base classes (defining the API) + +class CodecInfo(tuple): + """Codec details when looking up the codec registry""" + + # Private API to allow Python 3.4 to blacklist the known non-Unicode + # codecs in the standard library. A more general mechanism to + # reliably distinguish test encodings from other codecs will hopefully + # be defined for Python 3.5 + # + # See http://bugs.python.org/issue19619 + _is_text_encoding = True # Assume codecs are text encodings by default + + def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None, + *, _is_text_encoding=None): + self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter)) + self.name = name + self.encode = encode + self.decode = decode + self.incrementalencoder = incrementalencoder + self.incrementaldecoder = incrementaldecoder + self.streamwriter = streamwriter + self.streamreader = streamreader + if _is_text_encoding is not None: + self._is_text_encoding = _is_text_encoding + return self + + def __repr__(self): + return "<%s.%s object for encoding %s at %#x>" % \ + (self.__class__.__module__, self.__class__.__qualname__, + self.name, id(self)) + +class Codec: + + """ Defines the interface for stateless encoders/decoders. + + The .encode()/.decode() methods may use different error + handling schemes by providing the errors argument. These + string values are predefined: + + 'strict' - raise a ValueError error (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace' - replace with a suitable replacement character; + Python will use the official U+FFFD REPLACEMENT + CHARACTER for the builtin Unicode codecs on + decoding and '?' on encoding. + 'surrogateescape' - replace with private code points U+DCnn. + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference (only for encoding). + 'backslashreplace' - Replace with backslashed escape sequences. + 'namereplace' - Replace with \\N{...} escape sequences + (only for encoding). + + The set of allowed values can be extended via register_error. + + """ + def encode(self, input, errors='strict'): + + """ Encodes the object input and returns a tuple (output + object, length consumed). + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamWriter for codecs which have to keep state in order to + make encoding efficient. + + The encoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + + def decode(self, input, errors='strict'): + + """ Decodes the object input and returns a tuple (output + object, length consumed). + + input must be an object which provides the bf_getreadbuf + buffer slot. Python strings, buffer objects and memory + mapped files are examples of objects providing this slot. + + errors defines the error handling to apply. It defaults to + 'strict' handling. + + The method may not store state in the Codec instance. Use + StreamReader for codecs which have to keep state in order to + make decoding efficient. + + The decoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + +class IncrementalEncoder(object): + """ + An IncrementalEncoder encodes an input in multiple steps. The input can + be passed piece by piece to the encode() method. The IncrementalEncoder + remembers the state of the encoding process between calls to encode(). + """ + def __init__(self, errors='strict'): + """ + Creates an IncrementalEncoder instance. + + The IncrementalEncoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + self.buffer = "" + + def encode(self, input, final=False): + """ + Encodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the encoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the encoder. + """ + return 0 + + def setstate(self, state): + """ + Set the current state of the encoder. state must have been + returned by getstate(). + """ + +class BufferedIncrementalEncoder(IncrementalEncoder): + """ + This subclass of IncrementalEncoder can be used as the baseclass for an + incremental encoder if the encoder must keep some of the output in a + buffer between calls to encode(). + """ + def __init__(self, errors='strict'): + IncrementalEncoder.__init__(self, errors) + # unencoded input that is kept between calls to encode() + self.buffer = "" + + def _buffer_encode(self, input, errors, final): + # Overwrite this method in subclasses: It must encode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def encode(self, input, final=False): + # encode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_encode(data, self.errors, final) + # keep unencoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalEncoder.reset(self) + self.buffer = "" + + def getstate(self): + return self.buffer or 0 + + def setstate(self, state): + self.buffer = state or "" + +class IncrementalDecoder(object): + """ + An IncrementalDecoder decodes an input in multiple steps. The input can + be passed piece by piece to the decode() method. The IncrementalDecoder + remembers the state of the decoding process between calls to decode(). + """ + def __init__(self, errors='strict'): + """ + Create an IncrementalDecoder instance. + + The IncrementalDecoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + + def decode(self, input, final=False): + """ + Decode input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Reset the decoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the decoder. + + This must be a (buffered_input, additional_state_info) tuple. + buffered_input must be a bytes object containing bytes that + were passed to decode() that have not yet been converted. + additional_state_info must be a non-negative integer + representing the state of the decoder WITHOUT yet having + processed the contents of buffered_input. In the initial state + and after reset(), getstate() must return (b"", 0). + """ + return (b"", 0) + + def setstate(self, state): + """ + Set the current state of the decoder. + + state must have been returned by getstate(). The effect of + setstate((b"", 0)) must be equivalent to reset(). + """ + +class BufferedIncrementalDecoder(IncrementalDecoder): + """ + This subclass of IncrementalDecoder can be used as the baseclass for an + incremental decoder if the decoder must be able to handle incomplete + byte sequences. + """ + def __init__(self, errors='strict'): + IncrementalDecoder.__init__(self, errors) + # undecoded input that is kept between calls to decode() + self.buffer = b"" + + def _buffer_decode(self, input, errors, final): + # Overwrite this method in subclasses: It must decode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def decode(self, input, final=False): + # decode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_decode(data, self.errors, final) + # keep undecoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalDecoder.reset(self) + self.buffer = b"" + + def getstate(self): + # additional state info is always 0 + return (self.buffer, 0) + + def setstate(self, state): + # ignore additional state info + self.buffer = state[0] + +# +# The StreamWriter and StreamReader class provide generic working +# interfaces which can be used to implement new encoding submodules +# very easily. See encodings/utf_8.py for an example on how this is +# done. +# + +class StreamWriter(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamWriter instance. + + stream must be a file-like object open for writing. + + The StreamWriter may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference. + 'backslashreplace' - Replace with backslashed escape + sequences. + 'namereplace' - Replace with \\N{...} escape sequences. + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + + def write(self, object): + + """ Writes the object's contents encoded to self.stream. + """ + data, consumed = self.encode(object, self.errors) + self.stream.write(data) + + def writelines(self, list): + + """ Writes the concatenated list of strings to the stream + using .write(). + """ + self.write(''.join(list)) + + def reset(self): + + """ Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the + output is put into a clean state, that allows appending + of new fresh data without having to rescan the whole + stream to recover state. + + """ + pass + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + if whence == 0 and offset == 0: + self.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReader(Codec): + + charbuffertype = str + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamReader instance. + + stream must be a file-like object open for reading. + + The StreamReader may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'backslashreplace' - Replace with backslashed escape sequences; + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + self.bytebuffer = b"" + self._empty_charbuffer = self.charbuffertype() + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def decode(self, input, errors='strict'): + raise NotImplementedError + + def read(self, size=-1, chars=-1, firstline=False): + + """ Decodes data from the stream self.stream and returns the + resulting object. + + chars indicates the number of decoded code points or bytes to + return. read() will never return more data than requested, + but it might return less, if there is not enough available. + + size indicates the approximate maximum number of decoded + bytes or code points to read for decoding. The decoder + can modify this setting as appropriate. The default value + -1 indicates to read and decode as much as possible. size + is intended to prevent having to decode huge files in one + step. + + If firstline is true, and a UnicodeDecodeError happens + after the first line terminator in the input only the first line + will be returned, the rest of the input will be kept until the + next call to read(). + + The method should use a greedy read strategy, meaning that + it should read as much data as is allowed within the + definition of the encoding and the given size, e.g. if + optional encoding endings or state markers are available + on the stream, these should be read too. + """ + # If we have lines cached, first merge them back into characters + if self.linebuffer: + self.charbuffer = self._empty_charbuffer.join(self.linebuffer) + self.linebuffer = None + + if chars < 0: + # For compatibility with other read() methods that take a + # single argument + chars = size + + # read until we get the required number of characters (if available) + while True: + # can the request be satisfied from the character buffer? + if chars >= 0: + if len(self.charbuffer) >= chars: + break + # we need more data + if size < 0: + newdata = self.stream.read() + else: + newdata = self.stream.read(size) + # decode bytes (those remaining from the last call included) + data = self.bytebuffer + newdata + if not data: + break + try: + newchars, decodedbytes = self.decode(data, self.errors) + except UnicodeDecodeError as exc: + if firstline: + newchars, decodedbytes = \ + self.decode(data[:exc.start], self.errors) + lines = newchars.splitlines(keepends=True) + if len(lines)<=1: + raise + else: + raise + # keep undecoded bytes until the next call + self.bytebuffer = data[decodedbytes:] + # put new characters in the character buffer + self.charbuffer += newchars + # there was no data available + if not newdata: + break + if chars < 0: + # Return everything we've got + result = self.charbuffer + self.charbuffer = self._empty_charbuffer + else: + # Return the first chars characters + result = self.charbuffer[:chars] + self.charbuffer = self.charbuffer[chars:] + return result + + def readline(self, size=None, keepends=True): + + """ Read one line from the input stream and return the + decoded data. + + size, if given, is passed as size argument to the + read() method. + + """ + # If we have lines cached from an earlier read, return + # them unconditionally + if self.linebuffer: + line = self.linebuffer[0] + del self.linebuffer[0] + if len(self.linebuffer) == 1: + # revert to charbuffer mode; we might need more data + # next time + self.charbuffer = self.linebuffer[0] + self.linebuffer = None + if not keepends: + line = line.splitlines(keepends=False)[0] + return line + + readsize = size or 72 + line = self._empty_charbuffer + # If size is given, we call read() only once + while True: + data = self.read(readsize, firstline=True) + if data: + # If we're at a "\r" read one extra character (which might + # be a "\n") to get a proper line ending. If the stream is + # temporarily exhausted we return the wrong line ending. + if (isinstance(data, str) and data.endswith("\r")) or \ + (isinstance(data, bytes) and data.endswith(b"\r")): + data += self.read(size=1, chars=1) + + line += data + lines = line.splitlines(keepends=True) + if lines: + if len(lines) > 1: + # More than one line result; the first line is a full line + # to return + line = lines[0] + del lines[0] + if len(lines) > 1: + # cache the remaining lines + lines[-1] += self.charbuffer + self.linebuffer = lines + self.charbuffer = None + else: + # only one remaining line, put it back into charbuffer + self.charbuffer = lines[0] + self.charbuffer + if not keepends: + line = line.splitlines(keepends=False)[0] + break + line0withend = lines[0] + line0withoutend = lines[0].splitlines(keepends=False)[0] + if line0withend != line0withoutend: # We really have a line end + # Put the rest back together and keep it until the next call + self.charbuffer = self._empty_charbuffer.join(lines[1:]) + \ + self.charbuffer + if keepends: + line = line0withend + else: + line = line0withoutend + break + # we didn't get anything or this was our only try + if not data or size is not None: + if line and not keepends: + line = line.splitlines(keepends=False)[0] + break + if readsize < 8000: + readsize *= 2 + return line + + def readlines(self, sizehint=None, keepends=True): + + """ Read all lines available on the input stream + and return them as a list. + + Line breaks are implemented using the codec's decoder + method and are included in the list entries. + + sizehint, if given, is ignored since there is no efficient + way to finding the true end-of-line. + + """ + data = self.read() + return data.splitlines(keepends) + + def reset(self): + + """ Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. + This method is primarily intended to be able to recover + from decoding errors. + + """ + self.bytebuffer = b"" + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def seek(self, offset, whence=0): + """ Set the input stream's current position. + + Resets the codec buffers used for keeping state. + """ + self.stream.seek(offset, whence) + self.reset() + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + line = self.readline() + if line: + return line + raise StopIteration + + def __iter__(self): + return self + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReaderWriter: + + """ StreamReaderWriter instances allow wrapping streams which + work in both read and write modes. + + The design is such that one can use the factory functions + returned by the codec.lookup() function to construct the + instance. + + """ + # Optional attributes set by the file wrappers below + encoding = 'unknown' + + def __init__(self, stream, Reader, Writer, errors='strict'): + + """ Creates a StreamReaderWriter instance. + + stream must be a Stream-like object. + + Reader, Writer must be factory functions or classes + providing the StreamReader, StreamWriter interface resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + return self.reader.read(size) + + def readline(self, size=None): + + return self.reader.readline(size) + + def readlines(self, sizehint=None): + + return self.reader.readlines(sizehint) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + return next(self.reader) + + def __iter__(self): + return self + + def write(self, data): + + return self.writer.write(data) + + def writelines(self, list): + + return self.writer.writelines(list) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + self.reader.reset() + if whence == 0 and offset == 0: + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + # these are needed to make "with codecs.open(...)" work properly + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamRecoder: + + """ StreamRecoder instances translate data from one encoding to another. + + They use the complete set of APIs returned by the + codecs.lookup() function to implement their task. + + Data written to the StreamRecoder is first decoded into an + intermediate format (depending on the "decode" codec) and then + written to the underlying stream using an instance of the provided + Writer class. + + In the other direction, data is read from the underlying stream using + a Reader instance and then encoded and returned to the caller. + + """ + # Optional attributes set by the file wrappers below + data_encoding = 'unknown' + file_encoding = 'unknown' + + def __init__(self, stream, encode, decode, Reader, Writer, + errors='strict'): + + """ Creates a StreamRecoder instance which implements a two-way + conversion: encode and decode work on the frontend (the + data visible to .read() and .write()) while Reader and Writer + work on the backend (the data in stream). + + You can use these objects to do transparent + transcodings from e.g. latin-1 to utf-8 and back. + + stream must be a file-like object. + + encode and decode must adhere to the Codec interface; Reader and + Writer must be factory functions or classes providing the + StreamReader and StreamWriter interfaces resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.encode = encode + self.decode = decode + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + data = self.reader.read(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readline(self, size=None): + + if size is None: + data = self.reader.readline() + else: + data = self.reader.readline(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readlines(self, sizehint=None): + + data = self.reader.read() + data, bytesencoded = self.encode(data, self.errors) + return data.splitlines(keepends=True) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + data = next(self.reader) + data, bytesencoded = self.encode(data, self.errors) + return data + + def __iter__(self): + return self + + def write(self, data): + + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def writelines(self, list): + + data = ''.join(list) + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### Shortcuts + +def open(filename, mode='r', encoding=None, errors='strict', buffering=1): + + """ Open an encoded file using the given mode and return + a wrapped version providing transparent encoding/decoding. + + Note: The wrapped version will only accept the object format + defined by the codecs, i.e. Unicode objects for most builtin + codecs. Output is also codec dependent and will usually be + Unicode as well. + + Underlying encoded files are always opened in binary mode. + The default file mode is 'r', meaning to open the file in read mode. + + encoding specifies the encoding which is to be used for the + file. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + buffering has the same meaning as for the builtin open() API. + It defaults to line buffered. + + The returned wrapped file object provides an extra attribute + .encoding which allows querying the used encoding. This + attribute is only available if an encoding was specified as + parameter. + + """ + if encoding is not None and \ + 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' + file = builtins.open(filename, mode, buffering) + if encoding is None: + return file + info = lookup(encoding) + srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors) + # Add attributes to simplify introspection + srw.encoding = encoding + return srw + +def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): + + """ Return a wrapped version of file which provides transparent + encoding translation. + + Data written to the wrapped file is decoded according + to the given data_encoding and then encoded to the underlying + file using file_encoding. The intermediate data type + will usually be Unicode but depends on the specified codecs. + + Bytes read from the file are decoded using file_encoding and then + passed back to the caller encoded using data_encoding. + + If file_encoding is not given, it defaults to data_encoding. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + The returned wrapped file object provides two extra attributes + .data_encoding and .file_encoding which reflect the given + parameters of the same name. The attributes can be used for + introspection by Python programs. + + """ + if file_encoding is None: + file_encoding = data_encoding + data_info = lookup(data_encoding) + file_info = lookup(file_encoding) + sr = StreamRecoder(file, data_info.encode, data_info.decode, + file_info.streamreader, file_info.streamwriter, errors) + # Add attributes to simplify introspection + sr.data_encoding = data_encoding + sr.file_encoding = file_encoding + return sr + +### Helpers for codec lookup + +def getencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its encoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).encode + +def getdecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its decoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).decode + +def getincrementalencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalEncoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental encoder. + + """ + encoder = lookup(encoding).incrementalencoder + if encoder is None: + raise LookupError(encoding) + return encoder + +def getincrementaldecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalDecoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental decoder. + + """ + decoder = lookup(encoding).incrementaldecoder + if decoder is None: + raise LookupError(encoding) + return decoder + +def getreader(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamReader class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamreader + +def getwriter(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamWriter class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamwriter + +def iterencode(iterator, encoding, errors='strict', **kwargs): + """ + Encoding iterator. + + Encodes the input strings from the iterator using an IncrementalEncoder. + + errors and kwargs are passed through to the IncrementalEncoder + constructor. + """ + encoder = getincrementalencoder(encoding)(errors, **kwargs) + for input in iterator: + output = encoder.encode(input) + if output: + yield output + output = encoder.encode("", True) + if output: + yield output + +def iterdecode(iterator, encoding, errors='strict', **kwargs): + """ + Decoding iterator. + + Decodes the input strings from the iterator using an IncrementalDecoder. + + errors and kwargs are passed through to the IncrementalDecoder + constructor. + """ + decoder = getincrementaldecoder(encoding)(errors, **kwargs) + for input in iterator: + output = decoder.decode(input) + if output: + yield output + output = decoder.decode(b"", True) + if output: + yield output + +### Helpers for charmap-based codecs + +def make_identity_dict(rng): + + """ make_identity_dict(rng) -> dict + + Return a dictionary where elements of the rng sequence are + mapped to themselves. + + """ + return {i:i for i in rng} + +def make_encoding_map(decoding_map): + + """ Creates an encoding map from a decoding map. + + If a target mapping in the decoding map occurs multiple + times, then that target is mapped to None (undefined mapping), + causing an exception when encountered by the charmap codec + during translation. + + One example where this happens is cp875.py which decodes + multiple character to \\u001a. + + """ + m = {} + for k,v in decoding_map.items(): + if not v in m: + m[v] = k + else: + m[v] = None + return m + +### error handlers + +try: + strict_errors = lookup_error("strict") + ignore_errors = lookup_error("ignore") + replace_errors = lookup_error("replace") + xmlcharrefreplace_errors = lookup_error("xmlcharrefreplace") + backslashreplace_errors = lookup_error("backslashreplace") + namereplace_errors = lookup_error("namereplace") +except LookupError: + # In --disable-unicode builds, these error handler are missing + strict_errors = None + ignore_errors = None + replace_errors = None + xmlcharrefreplace_errors = None + backslashreplace_errors = None + namereplace_errors = None + +# Tell modulefinder that using codecs probably needs the encodings +# package +_false = 0 +if _false: + import encodings + +### Tests + +if __name__ == '__main__': + + # Make stdout translate Latin-1 output into UTF-8 output + sys.stdout = EncodedFile(sys.stdout, 'latin-1', 'utf-8') + + # Have stdin translate Latin-1 input into UTF-8 input + sys.stdin = EncodedFile(sys.stdin, 'utf-8', 'latin-1') diff --git a/flaskwebproject/FlaskWebProject1/Lib/collections/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/collections/__init__.py new file mode 100644 index 0000000..26aeac1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/collections/__init__.py @@ -0,0 +1,1244 @@ +'''This module implements specialized container datatypes providing +alternatives to Python's general purpose built-in containers, dict, +list, set, and tuple. + +* namedtuple factory function for creating tuple subclasses with named fields +* deque list-like container with fast appends and pops on either end +* ChainMap dict-like class for creating a single view of multiple mappings +* Counter dict subclass for counting hashable objects +* OrderedDict dict subclass that remembers the order entries were added +* defaultdict dict subclass that calls a factory function to supply missing values +* UserDict wrapper around dictionary objects for easier dict subclassing +* UserList wrapper around list objects for easier list subclassing +* UserString wrapper around string objects for easier string subclassing + +''' + +__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', + 'UserString', 'Counter', 'OrderedDict', 'ChainMap'] + +# For backwards compatibility, continue to make the collections ABCs +# available through the collections module. +from _collections_abc import * +import _collections_abc +__all__ += _collections_abc.__all__ + +from operator import itemgetter as _itemgetter, eq as _eq +from keyword import iskeyword as _iskeyword +import sys as _sys +import heapq as _heapq +from _weakref import proxy as _proxy +from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +from reprlib import recursive_repr as _recursive_repr + +try: + from _collections import deque +except ImportError: + pass +else: + MutableSequence.register(deque) + +try: + from _collections import defaultdict +except ImportError: + pass + + +################################################################################ +### OrderedDict +################################################################################ + +class _OrderedDictKeysView(KeysView): + + def __reversed__(self): + yield from reversed(self._mapping) + +class _OrderedDictItemsView(ItemsView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield (key, self._mapping[key]) + +class _OrderedDictValuesView(ValuesView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield self._mapping[key] + +class _Link(object): + __slots__ = 'prev', 'next', 'key', '__weakref__' + +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 regular dictionaries. + + # The internal self.__map dict 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). + # The sentinel is in self.__hardroot with a weakref proxy in self.__root. + # The prev links are weakref proxies (to prevent circular references). + # Individual links are kept alive by the hard reference in self.__map. + # Those hard references disappear when a key is deleted from an OrderedDict. + + def __init__(*args, **kwds): + '''Initialize an ordered dictionary. The signature is the same as + regular dictionaries. Keyword argument order is preserved. + ''' + if not args: + raise TypeError("descriptor '__init__' of 'OrderedDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__hardroot = _Link() + self.__root = root = _proxy(self.__hardroot) + root.prev = root.next = root + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, + dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link at the end of the linked list, + # and the inherited dictionary is updated with the new key/value pair. + if key not in self: + self.__map[key] = link = Link() + root = self.__root + last = root.prev + link.prev, link.next, link.key = last, root, key + last.next = link + root.prev = proxy(link) + 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 gets + # removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link = self.__map.pop(key) + link_prev = link.prev + link_next = link.next + link_prev.next = link_next + link_next.prev = link_prev + link.prev = None + link.next = None + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + # Traverse the linked list in order. + root = self.__root + curr = root.next + while curr is not root: + yield curr.key + curr = curr.next + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + # Traverse the linked list in reverse order. + root = self.__root + curr = root.prev + while curr is not root: + yield curr.key + curr = curr.prev + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + root = self.__root + root.prev = root.next = root + self.__map.clear() + dict.clear(self) + + def popitem(self, last=True): + '''Remove and return a (key, value) pair from the dictionary. + + 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.prev + link_prev = link.prev + link_prev.next = root + root.prev = link_prev + else: + link = root.next + link_next = link.next + root.next = link_next + link_next.prev = root + key = link.key + del self.__map[key] + value = dict.pop(self, key) + return key, value + + def move_to_end(self, key, last=True): + '''Move an existing element to the end (or beginning if last==False). + + Raises KeyError if the element does not exist. + When last=True, acts like a fast version of self[key]=self.pop(key). + + ''' + link = self.__map[key] + link_prev = link.prev + link_next = link.next + soft_link = link_next.prev + link_prev.next = link_next + link_next.prev = link_prev + root = self.__root + if last: + last = root.prev + link.prev = last + link.next = root + root.prev = soft_link + last.next = link + else: + first = root.next + link.prev = root + link.next = first + first.prev = soft_link + root.next = link + + def __sizeof__(self): + sizeof = _sys.getsizeof + n = len(self) + 1 # number of links including root + size = sizeof(self.__dict__) # instance dictionary + size += sizeof(self.__map) * 2 # internal dict and inherited dict + size += sizeof(self.__hardroot) * n # link objects + size += sizeof(self.__root) * n # proxy objects + return size + + update = __update = MutableMapping.update + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return _OrderedDictKeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return _OrderedDictItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return _OrderedDictValuesView(self) + + __ne__ = MutableMapping.__ne__ + + __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 + + @_recursive_repr() + def __repr__(self): + 'od.__repr__() <==> repr(od)' + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, list(self.items())) + + def __reduce__(self): + 'Return state information for pickling' + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + return self.__class__, (), inst_dict or None, None, iter(self.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. + If not specified, the value defaults to None. + + ''' + self = cls() + for key in iterable: + self[key] = value + return self + + 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 dict.__eq__(self, other) and all(map(_eq, self, other)) + return dict.__eq__(self, other) + + +try: + from _collections import OrderedDict +except ImportError: + # Leave the pure Python version in place. + pass + + +################################################################################ +### namedtuple +################################################################################ + +_class_template = """\ +from builtins import property as _property, tuple as _tuple +from operator import itemgetter as _itemgetter +from collections import OrderedDict + +class {typename}(tuple): + '{typename}({arg_list})' + + __slots__ = () + + _fields = {field_names!r} + + def __new__(_cls, {arg_list}): + 'Create new instance of {typename}({arg_list})' + return _tuple.__new__(_cls, ({arg_list})) + + @classmethod + def _make(cls, iterable, new=tuple.__new__, len=len): + 'Make a new {typename} object from a sequence or iterable' + result = new(cls, iterable) + if len(result) != {num_fields:d}: + raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result)) + return result + + def _replace(_self, **kwds): + 'Return a new {typename} object replacing specified fields with new values' + result = _self._make(map(kwds.pop, {field_names!r}, _self)) + if kwds: + raise ValueError('Got unexpected field names: %r' % list(kwds)) + return result + + def __repr__(self): + 'Return a nicely formatted representation string' + return self.__class__.__name__ + '({repr_fmt})' % self + + def _asdict(self): + 'Return a new OrderedDict which maps field names to their values.' + return OrderedDict(zip(self._fields, self)) + + def __getnewargs__(self): + 'Return self as a plain tuple. Used by copy and pickle.' + return tuple(self) + +{field_defs} +""" + +_repr_template = '{name}=%r' + +_field_template = '''\ + {name} = _property(_itemgetter({index:d}), doc='Alias for field number {index:d}') +''' + +def namedtuple(typename, field_names, *, verbose=False, rename=False, module=None): + """Returns a new subclass of tuple with named fields. + + >>> Point = namedtuple('Point', ['x', 'y']) + >>> Point.__doc__ # docstring for the new class + 'Point(x, y)' + >>> p = Point(11, y=22) # instantiate with positional args or keywords + >>> p[0] + p[1] # indexable like a plain tuple + 33 + >>> x, y = p # unpack like a regular tuple + >>> x, y + (11, 22) + >>> p.x + p.y # fields also accessible by name + 33 + >>> d = p._asdict() # convert to a dictionary + >>> d['x'] + 11 + >>> Point(**d) # convert from a dictionary + Point(x=11, y=22) + >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields + Point(x=100, y=22) + + """ + + # Validate the field names. At the user's option, either generate an error + # message or automatically replace the field name with a valid name. + if isinstance(field_names, str): + field_names = field_names.replace(',', ' ').split() + field_names = list(map(str, field_names)) + typename = str(typename) + if rename: + seen = set() + for index, name in enumerate(field_names): + if (not name.isidentifier() + or _iskeyword(name) + or name.startswith('_') + or name in seen): + field_names[index] = '_%d' % index + seen.add(name) + for name in [typename] + field_names: + if type(name) is not str: + raise TypeError('Type names and field names must be strings') + if not name.isidentifier(): + raise ValueError('Type names and field names must be valid ' + 'identifiers: %r' % name) + if _iskeyword(name): + raise ValueError('Type names and field names cannot be a ' + 'keyword: %r' % name) + seen = set() + for name in field_names: + if name.startswith('_') and not rename: + raise ValueError('Field names cannot start with an underscore: ' + '%r' % name) + if name in seen: + raise ValueError('Encountered duplicate field name: %r' % name) + seen.add(name) + + # Fill-in the class template + class_definition = _class_template.format( + typename = typename, + field_names = tuple(field_names), + num_fields = len(field_names), + arg_list = repr(tuple(field_names)).replace("'", "")[1:-1], + repr_fmt = ', '.join(_repr_template.format(name=name) + for name in field_names), + field_defs = '\n'.join(_field_template.format(index=index, name=name) + for index, name in enumerate(field_names)) + ) + + # Execute the template string in a temporary namespace and support + # tracing utilities by setting a value for frame.f_globals['__name__'] + namespace = dict(__name__='namedtuple_%s' % typename) + exec(class_definition, namespace) + result = namespace[typename] + result._source = class_definition + if verbose: + print(result._source) + + # For pickling to work, the __module__ variable needs to be set to the frame + # where the named tuple is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython), or where the user has + # specified a particular module. + if module is None: + try: + module = _sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + if module is not None: + result.__module__ = module + + return result + + +######################################################################## +### Counter +######################################################################## + +def _count_elements(mapping, iterable): + 'Tally elements from the iterable.' + mapping_get = mapping.get + for elem in iterable: + mapping[elem] = mapping_get(elem, 0) + 1 + +try: # Load C helper function if available + from _collections import _count_elements +except ImportError: + pass + +class Counter(dict): + '''Dict subclass for counting hashable items. Sometimes called a bag + or multiset. Elements are stored as dictionary keys and their counts + are stored as dictionary values. + + >>> c = Counter('abcdeabcdabcaba') # count elements from a string + + >>> c.most_common(3) # three most common elements + [('a', 5), ('b', 4), ('c', 3)] + >>> sorted(c) # list all unique elements + ['a', 'b', 'c', 'd', 'e'] + >>> ''.join(sorted(c.elements())) # list elements with repetitions + 'aaaaabbbbcccdde' + >>> sum(c.values()) # total of all counts + 15 + + >>> c['a'] # count of letter 'a' + 5 + >>> for elem in 'shazam': # update counts from an iterable + ... c[elem] += 1 # by adding 1 to each element's count + >>> c['a'] # now there are seven 'a' + 7 + >>> del c['b'] # remove all 'b' + >>> c['b'] # now there are zero 'b' + 0 + + >>> d = Counter('simsalabim') # make another counter + >>> c.update(d) # add in the second counter + >>> c['a'] # now there are nine 'a' + 9 + + >>> c.clear() # empty the counter + >>> c + Counter() + + Note: If a count is set to zero or reduced to zero, it will remain + in the counter until the entry is deleted or the counter is cleared: + + >>> c = Counter('aaabbc') + >>> c['b'] -= 2 # reduce the count of 'b' by two + >>> c.most_common() # 'b' is still in, but its count is zero + [('a', 3), ('c', 1), ('b', 0)] + + ''' + # References: + # http://en.wikipedia.org/wiki/Multiset + # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html + # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm + # http://code.activestate.com/recipes/259174/ + # Knuth, TAOCP Vol. II section 4.6.3 + + def __init__(*args, **kwds): + '''Create a new, empty Counter object. And if given, count elements + from an input iterable. Or, initialize the count from another mapping + of elements to their counts. + + >>> c = Counter() # a new, empty counter + >>> c = Counter('gallahad') # a new counter from an iterable + >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping + >>> c = Counter(a=4, b=2) # a new counter from keyword args + + ''' + if not args: + raise TypeError("descriptor '__init__' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + super(Counter, self).__init__() + self.update(*args, **kwds) + + def __missing__(self, key): + 'The count of elements not in the Counter is zero.' + # Needed so that self[missing_item] does not raise KeyError + return 0 + + def most_common(self, n=None): + '''List the n most common elements and their counts from the most + common to the least. If n is None, then list all element counts. + + >>> Counter('abcdeabcdabcaba').most_common(3) + [('a', 5), ('b', 4), ('c', 3)] + + ''' + # Emulate Bag.sortedByCount from Smalltalk + if n is None: + return sorted(self.items(), key=_itemgetter(1), reverse=True) + return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) + + def elements(self): + '''Iterator over elements repeating each as many times as its count. + + >>> c = Counter('ABCABC') + >>> sorted(c.elements()) + ['A', 'A', 'B', 'B', 'C', 'C'] + + # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) + >>> product = 1 + >>> for factor in prime_factors.elements(): # loop over factors + ... product *= factor # and multiply them + >>> product + 1836 + + Note, if an element's count has been set to zero or is a negative + number, elements() will ignore it. + + ''' + # Emulate Bag.do from Smalltalk and Multiset.begin from C++. + return _chain.from_iterable(_starmap(_repeat, self.items())) + + # Override dict methods where necessary + + @classmethod + def fromkeys(cls, iterable, v=None): + # There is no equivalent method for counters because setting v=1 + # means that no element can have a count greater than one. + raise NotImplementedError( + 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') + + def update(*args, **kwds): + '''Like dict.update() but add counts instead of replacing them. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.update('witch') # add elements from another iterable + >>> d = Counter('watch') + >>> c.update(d) # add elements from another counter + >>> c['h'] # four 'h' in which, witch, and watch + 4 + + ''' + # The regular dict.update() operation makes no sense here because the + # replace behavior results in the some of original untouched counts + # being mixed-in with all of the other counts for a mismash that + # doesn't have a straight-forward interpretation in most counting + # contexts. Instead, we implement straight-addition. Both the inputs + # and outputs are allowed to contain zero and negative counts. + + if not args: + raise TypeError("descriptor 'update' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + if isinstance(iterable, Mapping): + if self: + self_get = self.get + for elem, count in iterable.items(): + self[elem] = count + self_get(elem, 0) + else: + super(Counter, self).update(iterable) # fast path when counter is empty + else: + _count_elements(self, iterable) + if kwds: + self.update(kwds) + + def subtract(*args, **kwds): + '''Like dict.update() but subtracts counts instead of replacing them. + Counts can be reduced below zero. Both the inputs and outputs are + allowed to contain zero and negative counts. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.subtract('witch') # subtract elements from another iterable + >>> c.subtract(Counter('watch')) # subtract elements from another counter + >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch + 0 + >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch + -1 + + ''' + if not args: + raise TypeError("descriptor 'subtract' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + self_get = self.get + if isinstance(iterable, Mapping): + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + for elem in iterable: + self[elem] = self_get(elem, 0) - 1 + if kwds: + self.subtract(kwds) + + def copy(self): + 'Return a shallow copy.' + return self.__class__(self) + + def __reduce__(self): + return self.__class__, (dict(self),) + + def __delitem__(self, elem): + 'Like dict.__delitem__() but does not raise KeyError for missing values.' + if elem in self: + super().__delitem__(elem) + + def __repr__(self): + if not self: + return '%s()' % self.__class__.__name__ + try: + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + except TypeError: + # handle case where values are not orderable + return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + + # Multiset-style mathematical operations discussed in: + # Knuth TAOCP Volume II section 4.6.3 exercise 19 + # and at http://en.wikipedia.org/wiki/Multiset + # + # Outputs guaranteed to only include positive counts. + # + # To strip negative and zero counts, add-in an empty counter: + # c += Counter() + + def __add__(self, other): + '''Add counts from two counters. + + >>> Counter('abbb') + Counter('bcc') + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count + other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __sub__(self, other): + ''' Subtract count, but keep only results with positive counts. + + >>> Counter('abbbc') - Counter('bccd') + Counter({'b': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count - other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count < 0: + result[elem] = 0 - count + return result + + def __or__(self, other): + '''Union is the maximum of value in either of the input counters. + + >>> Counter('abbb') | Counter('bcc') + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = other_count if count < other_count else count + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __and__(self, other): + ''' Intersection is the minimum of corresponding counts. + + >>> Counter('abbb') & Counter('bcc') + Counter({'b': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = count if count < other_count else other_count + if newcount > 0: + result[elem] = newcount + return result + + def __pos__(self): + 'Adds an empty counter, effectively stripping negative and zero counts' + result = Counter() + for elem, count in self.items(): + if count > 0: + result[elem] = count + return result + + def __neg__(self): + '''Subtracts from an empty counter. Strips positive and zero counts, + and flips the sign on negative counts. + + ''' + result = Counter() + for elem, count in self.items(): + if count < 0: + result[elem] = 0 - count + return result + + def _keep_positive(self): + '''Internal method to strip elements with a negative or zero count''' + nonpositive = [elem for elem, count in self.items() if not count > 0] + for elem in nonpositive: + del self[elem] + return self + + def __iadd__(self, other): + '''Inplace add from another counter, keeping only positive counts. + + >>> c = Counter('abbb') + >>> c += Counter('bcc') + >>> c + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] += count + return self._keep_positive() + + def __isub__(self, other): + '''Inplace subtract counter, but keep only results with positive counts. + + >>> c = Counter('abbbc') + >>> c -= Counter('bccd') + >>> c + Counter({'b': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] -= count + return self._keep_positive() + + def __ior__(self, other): + '''Inplace union is the maximum of value from either counter. + + >>> c = Counter('abbb') + >>> c |= Counter('bcc') + >>> c + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + for elem, other_count in other.items(): + count = self[elem] + if other_count > count: + self[elem] = other_count + return self._keep_positive() + + def __iand__(self, other): + '''Inplace intersection is the minimum of corresponding counts. + + >>> c = Counter('abbb') + >>> c &= Counter('bcc') + >>> c + Counter({'b': 1}) + + ''' + for elem, count in self.items(): + other_count = other[elem] + if other_count < count: + self[elem] = other_count + return self._keep_positive() + + +######################################################################## +### ChainMap +######################################################################## + +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 + be 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, m=None): # like Django's Context.push() + '''New ChainMap with a new map followed by all previous maps. + If no map is provided, an empty dict is used. + ''' + if m is None: + m = {} + return self.__class__(m, *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() + + +################################################################################ +### UserDict +################################################################################ + +class UserDict(MutableMapping): + + # Start by filling-out the abstract methods + def __init__(*args, **kwargs): + if not args: + raise TypeError("descriptor '__init__' of 'UserDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + if args: + dict = args[0] + elif 'dict' in kwargs: + dict = kwargs.pop('dict') + import warnings + warnings.warn("Passing 'dict' as keyword argument is deprecated", + DeprecationWarning, stacklevel=2) + else: + dict = None + self.data = {} + if dict is not None: + self.update(dict) + if len(kwargs): + self.update(kwargs) + def __len__(self): return len(self.data) + def __getitem__(self, key): + if key in self.data: + return self.data[key] + if hasattr(self.__class__, "__missing__"): + return self.__class__.__missing__(self, key) + raise KeyError(key) + def __setitem__(self, key, item): self.data[key] = item + def __delitem__(self, key): del self.data[key] + def __iter__(self): + return iter(self.data) + + # Modify __contains__ to work correctly when __missing__ is present + def __contains__(self, key): + return key in self.data + + # Now, add the methods in dicts but not in MutableMapping + def __repr__(self): return repr(self.data) + def copy(self): + if self.__class__ is UserDict: + return UserDict(self.data.copy()) + import copy + data = self.data + try: + self.data = {} + c = copy.copy(self) + finally: + self.data = data + c.update(self) + return c + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + + +################################################################################ +### UserList +################################################################################ + +class UserList(MutableSequence): + """A more or less complete user-defined wrapper around list objects.""" + def __init__(self, initlist=None): + self.data = [] + if initlist is not None: + # XXX should this accept an arbitrary sequence? + if type(initlist) == type(self.data): + self.data[:] = initlist + elif isinstance(initlist, UserList): + self.data[:] = initlist.data[:] + else: + self.data = list(initlist) + def __repr__(self): return repr(self.data) + def __lt__(self, other): return self.data < self.__cast(other) + def __le__(self, other): return self.data <= self.__cast(other) + def __eq__(self, other): return self.data == self.__cast(other) + def __gt__(self, other): return self.data > self.__cast(other) + def __ge__(self, other): return self.data >= self.__cast(other) + def __cast(self, other): + return other.data if isinstance(other, UserList) else other + def __contains__(self, item): return item in self.data + def __len__(self): return len(self.data) + def __getitem__(self, i): return self.data[i] + def __setitem__(self, i, item): self.data[i] = item + def __delitem__(self, i): del self.data[i] + def __add__(self, other): + if isinstance(other, UserList): + return self.__class__(self.data + other.data) + elif isinstance(other, type(self.data)): + return self.__class__(self.data + other) + return self.__class__(self.data + list(other)) + def __radd__(self, other): + if isinstance(other, UserList): + return self.__class__(other.data + self.data) + elif isinstance(other, type(self.data)): + return self.__class__(other + self.data) + return self.__class__(list(other) + self.data) + def __iadd__(self, other): + if isinstance(other, UserList): + self.data += other.data + elif isinstance(other, type(self.data)): + self.data += other + else: + self.data += list(other) + return self + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __imul__(self, n): + self.data *= n + return self + def append(self, item): self.data.append(item) + def insert(self, i, item): self.data.insert(i, item) + def pop(self, i=-1): return self.data.pop(i) + def remove(self, item): self.data.remove(item) + def clear(self): self.data.clear() + def copy(self): return self.__class__(self) + def count(self, item): return self.data.count(item) + def index(self, item, *args): return self.data.index(item, *args) + def reverse(self): self.data.reverse() + def sort(self, *args, **kwds): self.data.sort(*args, **kwds) + def extend(self, other): + if isinstance(other, UserList): + self.data.extend(other.data) + else: + self.data.extend(other) + + + +################################################################################ +### UserString +################################################################################ + +class UserString(Sequence): + def __init__(self, seq): + if isinstance(seq, str): + self.data = seq + elif isinstance(seq, UserString): + self.data = seq.data[:] + else: + self.data = str(seq) + def __str__(self): return str(self.data) + def __repr__(self): return repr(self.data) + def __int__(self): return int(self.data) + def __float__(self): return float(self.data) + def __complex__(self): return complex(self.data) + def __hash__(self): return hash(self.data) + def __getnewargs__(self): + return (self.data[:],) + + def __eq__(self, string): + if isinstance(string, UserString): + return self.data == string.data + return self.data == string + def __lt__(self, string): + if isinstance(string, UserString): + return self.data < string.data + return self.data < string + def __le__(self, string): + if isinstance(string, UserString): + return self.data <= string.data + return self.data <= string + def __gt__(self, string): + if isinstance(string, UserString): + return self.data > string.data + return self.data > string + def __ge__(self, string): + if isinstance(string, UserString): + return self.data >= string.data + return self.data >= string + + def __contains__(self, char): + if isinstance(char, UserString): + char = char.data + return char in self.data + + def __len__(self): return len(self.data) + def __getitem__(self, index): return self.__class__(self.data[index]) + def __add__(self, other): + if isinstance(other, UserString): + return self.__class__(self.data + other.data) + elif isinstance(other, str): + return self.__class__(self.data + other) + return self.__class__(self.data + str(other)) + def __radd__(self, other): + if isinstance(other, str): + return self.__class__(other + self.data) + return self.__class__(str(other) + self.data) + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __mod__(self, args): + return self.__class__(self.data % args) + def __rmod__(self, format): + return self.__class__(format % args) + + # the following methods are defined in alphabetical order: + def capitalize(self): return self.__class__(self.data.capitalize()) + def casefold(self): + return self.__class__(self.data.casefold()) + def center(self, width, *args): + return self.__class__(self.data.center(width, *args)) + def count(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.count(sub, start, end) + def encode(self, encoding=None, errors=None): # XXX improve this? + if encoding: + if errors: + return self.__class__(self.data.encode(encoding, errors)) + return self.__class__(self.data.encode(encoding)) + return self.__class__(self.data.encode()) + def endswith(self, suffix, start=0, end=_sys.maxsize): + return self.data.endswith(suffix, start, end) + def expandtabs(self, tabsize=8): + return self.__class__(self.data.expandtabs(tabsize)) + def find(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.find(sub, start, end) + def format(self, *args, **kwds): + return self.data.format(*args, **kwds) + def format_map(self, mapping): + return self.data.format_map(mapping) + def index(self, sub, start=0, end=_sys.maxsize): + return self.data.index(sub, start, end) + def isalpha(self): return self.data.isalpha() + def isalnum(self): return self.data.isalnum() + def isdecimal(self): return self.data.isdecimal() + def isdigit(self): return self.data.isdigit() + def isidentifier(self): return self.data.isidentifier() + def islower(self): return self.data.islower() + def isnumeric(self): return self.data.isnumeric() + def isprintable(self): return self.data.isprintable() + def isspace(self): return self.data.isspace() + def istitle(self): return self.data.istitle() + def isupper(self): return self.data.isupper() + def join(self, seq): return self.data.join(seq) + def ljust(self, width, *args): + return self.__class__(self.data.ljust(width, *args)) + def lower(self): return self.__class__(self.data.lower()) + def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) + maketrans = str.maketrans + def partition(self, sep): + return self.data.partition(sep) + def replace(self, old, new, maxsplit=-1): + if isinstance(old, UserString): + old = old.data + if isinstance(new, UserString): + new = new.data + return self.__class__(self.data.replace(old, new, maxsplit)) + def rfind(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.rfind(sub, start, end) + def rindex(self, sub, start=0, end=_sys.maxsize): + return self.data.rindex(sub, start, end) + def rjust(self, width, *args): + return self.__class__(self.data.rjust(width, *args)) + def rpartition(self, sep): + return self.data.rpartition(sep) + def rstrip(self, chars=None): + return self.__class__(self.data.rstrip(chars)) + def split(self, sep=None, maxsplit=-1): + return self.data.split(sep, maxsplit) + def rsplit(self, sep=None, maxsplit=-1): + return self.data.rsplit(sep, maxsplit) + def splitlines(self, keepends=False): return self.data.splitlines(keepends) + def startswith(self, prefix, start=0, end=_sys.maxsize): + return self.data.startswith(prefix, start, end) + def strip(self, chars=None): return self.__class__(self.data.strip(chars)) + def swapcase(self): return self.__class__(self.data.swapcase()) + def title(self): return self.__class__(self.data.title()) + def translate(self, *args): + return self.__class__(self.data.translate(*args)) + def upper(self): return self.__class__(self.data.upper()) + def zfill(self, width): return self.__class__(self.data.zfill(width)) diff --git a/flaskwebproject/FlaskWebProject1/Lib/collections/abc.py b/flaskwebproject/FlaskWebProject1/Lib/collections/abc.py new file mode 100644 index 0000000..891600d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/collections/abc.py @@ -0,0 +1,2 @@ +from _collections_abc import * +from _collections_abc import __all__ diff --git a/flaskwebproject/FlaskWebProject1/Lib/copy.py b/flaskwebproject/FlaskWebProject1/Lib/copy.py new file mode 100644 index 0000000..f86040a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/copy.py @@ -0,0 +1,313 @@ +"""Generic (shallow and deep) copying operations. + +Interface summary: + + import copy + + x = copy.copy(y) # make a shallow copy of y + x = copy.deepcopy(y) # make a deep copy of y + +For module specific errors, copy.Error is raised. + +The difference between shallow and deep copying is only relevant for +compound objects (objects that contain other objects, like lists or +class instances). + +- A shallow copy constructs a new compound object and then (to the + extent possible) inserts *the same objects* into it that the + original contains. + +- A deep copy constructs a new compound object and then, recursively, + inserts *copies* into it of the objects found in the original. + +Two problems often exist with deep copy operations that don't exist +with shallow copy operations: + + a) recursive objects (compound objects that, directly or indirectly, + contain a reference to themselves) may cause a recursive loop + + b) because deep copy copies *everything* it may copy too much, e.g. + administrative data structures that should be shared even between + copies + +Python's deep copy operation avoids these problems by: + + a) keeping a table of objects already copied during the current + copying pass + + b) letting user-defined classes override the copying operation or the + set of components copied + +This version does not copy types like module, class, function, method, +nor stack trace, stack frame, nor file, socket, window, nor array, nor +any similar types. + +Classes can use the same interfaces to control copying that they use +to control pickling: they can define methods called __getinitargs__(), +__getstate__() and __setstate__(). See the documentation for module +"pickle" for information on these methods. +""" + +import types +import weakref +from copyreg import dispatch_table + +class Error(Exception): + pass +error = Error # backward compatibility + +try: + from org.python.core import PyStringMap +except ImportError: + PyStringMap = None + +__all__ = ["Error", "copy", "deepcopy"] + +def copy(x): + """Shallow copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + cls = type(x) + + copier = _copy_dispatch.get(cls) + if copier: + return copier(x) + + try: + issc = issubclass(cls, type) + except TypeError: # cls is not a class + issc = False + if issc: + # treat it as a regular class: + return _copy_immutable(x) + + copier = getattr(cls, "__copy__", None) + if copier: + return copier(x) + + reductor = dispatch_table.get(cls) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(4) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error("un(shallow)copyable object of type %s" % cls) + + if isinstance(rv, str): + return x + return _reconstruct(x, None, *rv) + + +_copy_dispatch = d = {} + +def _copy_immutable(x): + return x +for t in (type(None), int, float, bool, complex, str, tuple, + bytes, frozenset, type, range, slice, + types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), + types.FunctionType, weakref.ref): + d[t] = _copy_immutable +t = getattr(types, "CodeType", None) +if t is not None: + d[t] = _copy_immutable + +d[list] = list.copy +d[dict] = dict.copy +d[set] = set.copy +d[bytearray] = bytearray.copy + +if PyStringMap is not None: + d[PyStringMap] = PyStringMap.copy + +del d, t + +def deepcopy(x, memo=None, _nil=[]): + """Deep copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + if memo is None: + memo = {} + + d = id(x) + y = memo.get(d, _nil) + if y is not _nil: + return y + + cls = type(x) + + copier = _deepcopy_dispatch.get(cls) + if copier: + y = copier(x, memo) + else: + try: + issc = issubclass(cls, type) + except TypeError: # cls is not a class (old Boost; see SF #502085) + issc = 0 + if issc: + y = _deepcopy_atomic(x, memo) + else: + copier = getattr(x, "__deepcopy__", None) + if copier: + y = copier(memo) + else: + reductor = dispatch_table.get(cls) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(4) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error( + "un(deep)copyable object of type %s" % cls) + if isinstance(rv, str): + y = x + else: + y = _reconstruct(x, memo, *rv) + + # If is its own copy, don't memoize. + if y is not x: + memo[d] = y + _keep_alive(x, memo) # Make sure x lives at least as long as d + return y + +_deepcopy_dispatch = d = {} + +def _deepcopy_atomic(x, memo): + return x +d[type(None)] = _deepcopy_atomic +d[type(Ellipsis)] = _deepcopy_atomic +d[type(NotImplemented)] = _deepcopy_atomic +d[int] = _deepcopy_atomic +d[float] = _deepcopy_atomic +d[bool] = _deepcopy_atomic +d[complex] = _deepcopy_atomic +d[bytes] = _deepcopy_atomic +d[str] = _deepcopy_atomic +try: + d[types.CodeType] = _deepcopy_atomic +except AttributeError: + pass +d[type] = _deepcopy_atomic +d[types.BuiltinFunctionType] = _deepcopy_atomic +d[types.FunctionType] = _deepcopy_atomic +d[weakref.ref] = _deepcopy_atomic + +def _deepcopy_list(x, memo, deepcopy=deepcopy): + y = [] + memo[id(x)] = y + append = y.append + for a in x: + append(deepcopy(a, memo)) + return y +d[list] = _deepcopy_list + +def _deepcopy_tuple(x, memo, deepcopy=deepcopy): + y = [deepcopy(a, memo) for a in x] + # We're not going to put the tuple in the memo, but it's still important we + # check for it, in case the tuple contains recursive mutable structures. + try: + return memo[id(x)] + except KeyError: + pass + for k, j in zip(x, y): + if k is not j: + y = tuple(y) + break + else: + y = x + return y +d[tuple] = _deepcopy_tuple + +def _deepcopy_dict(x, memo, deepcopy=deepcopy): + y = {} + memo[id(x)] = y + for key, value in x.items(): + y[deepcopy(key, memo)] = deepcopy(value, memo) + return y +d[dict] = _deepcopy_dict +if PyStringMap is not None: + d[PyStringMap] = _deepcopy_dict + +def _deepcopy_method(x, memo): # Copy instance methods + return type(x)(x.__func__, deepcopy(x.__self__, memo)) +d[types.MethodType] = _deepcopy_method + +del d + +def _keep_alive(x, memo): + """Keeps a reference to the object x in the memo. + + Because we remember objects by their id, we have + to assure that possibly temporary objects are kept + alive by referencing them. + We store a reference at the id of the memo, which should + normally not be used unless someone tries to deepcopy + the memo itself... + """ + try: + memo[id(memo)].append(x) + except KeyError: + # aha, this is the first one :-) + memo[id(memo)]=[x] + +def _reconstruct(x, memo, func, args, + state=None, listiter=None, dictiter=None, + deepcopy=deepcopy): + deep = memo is not None + if deep and args: + args = (deepcopy(arg, memo) for arg in args) + y = func(*args) + if deep: + memo[id(x)] = y + + if state is not None: + if deep: + state = deepcopy(state, memo) + if hasattr(y, '__setstate__'): + y.__setstate__(state) + else: + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + else: + slotstate = None + if state is not None: + y.__dict__.update(state) + if slotstate is not None: + for key, value in slotstate.items(): + setattr(y, key, value) + + if listiter is not None: + if deep: + for item in listiter: + item = deepcopy(item, memo) + y.append(item) + else: + for item in listiter: + y.append(item) + if dictiter is not None: + if deep: + for key, value in dictiter: + key = deepcopy(key, memo) + value = deepcopy(value, memo) + y[key] = value + else: + for key, value in dictiter: + y[key] = value + return y + +del types, weakref, PyStringMap diff --git a/flaskwebproject/FlaskWebProject1/Lib/copyreg.py b/flaskwebproject/FlaskWebProject1/Lib/copyreg.py new file mode 100644 index 0000000..cef9984 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/copyreg.py @@ -0,0 +1,206 @@ +"""Helper to provide extensibility for pickle. + +This is only useful to add pickle support for extension types defined in +C, not for instances of user-defined classes. +""" + +__all__ = ["pickle", "constructor", + "add_extension", "remove_extension", "clear_extension_cache"] + +dispatch_table = {} + +def pickle(ob_type, pickle_function, constructor_ob=None): + if not callable(pickle_function): + raise TypeError("reduction functions must be callable") + dispatch_table[ob_type] = pickle_function + + # The constructor_ob function is a vestige of safe for unpickling. + # There is no reason for the caller to pass it anymore. + if constructor_ob is not None: + constructor(constructor_ob) + +def constructor(object): + if not callable(object): + raise TypeError("constructors must be callable") + +# Example: provide pickling support for complex numbers. + +try: + complex +except NameError: + pass +else: + + def pickle_complex(c): + return complex, (c.real, c.imag) + + pickle(complex, pickle_complex, complex) + +# Support for pickling new-style objects + +def _reconstructor(cls, base, state): + if base is object: + obj = object.__new__(cls) + else: + obj = base.__new__(cls, state) + if base.__init__ != object.__init__: + base.__init__(obj, state) + return obj + +_HEAPTYPE = 1<<9 + +# Python code for object.__reduce_ex__ for protocols 0 and 1 + +def _reduce_ex(self, proto): + assert proto < 2 + for base in self.__class__.__mro__: + if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: + break + else: + base = object # not really reachable + if base is object: + state = None + else: + if base is self.__class__: + raise TypeError("can't pickle %s objects" % base.__name__) + state = base(self) + args = (self.__class__, base, state) + try: + getstate = self.__getstate__ + except AttributeError: + if getattr(self, "__slots__", None): + raise TypeError("a class that defines __slots__ without " + "defining __getstate__ cannot be pickled") + try: + dict = self.__dict__ + except AttributeError: + dict = None + else: + dict = getstate() + if dict: + return _reconstructor, args, dict + else: + return _reconstructor, args + +# Helper for __reduce_ex__ protocol 2 + +def __newobj__(cls, *args): + return cls.__new__(cls, *args) + +def __newobj_ex__(cls, args, kwargs): + """Used by pickle protocol 4, instead of __newobj__ to allow classes with + keyword-only arguments to be pickled correctly. + """ + return cls.__new__(cls, *args, **kwargs) + +def _slotnames(cls): + """Return a list of slot names for a given class. + + This needs to find slots defined by the class and its bases, so we + can't simply return the __slots__ attribute. We must walk down + the Method Resolution Order and concatenate the __slots__ of each + class found there. (This assumes classes don't modify their + __slots__ attribute to misrepresent their slots after the class is + defined.) + """ + + # Get the value from a cache in the class if possible + names = cls.__dict__.get("__slotnames__") + if names is not None: + return names + + # Not cached -- calculate the value + names = [] + if not hasattr(cls, "__slots__"): + # This class has no slots + pass + else: + # Slots found -- gather slot names from all base classes + for c in cls.__mro__: + if "__slots__" in c.__dict__: + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, str): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + stripped = c.__name__.lstrip('_') + if stripped: + names.append('_%s%s' % (stripped, name)) + else: + names.append(name) + else: + names.append(name) + + # Cache the outcome in the class if at all possible + try: + cls.__slotnames__ = names + except: + pass # But don't die if we can't + + return names + +# A registry of extension codes. This is an ad-hoc compression +# mechanism. Whenever a global reference to , is about +# to be pickled, the (, ) tuple is looked up here to see +# if it is a registered extension code for it. Extension codes are +# universal, so that the meaning of a pickle does not depend on +# context. (There are also some codes reserved for local use that +# don't have this restriction.) Codes are positive ints; 0 is +# reserved. + +_extension_registry = {} # key -> code +_inverted_registry = {} # code -> key +_extension_cache = {} # code -> object +# Don't ever rebind those names: pickling grabs a reference to them when +# it's initialized, and won't see a rebinding. + +def add_extension(module, name, code): + """Register an extension code.""" + code = int(code) + if not 1 <= code <= 0x7fffffff: + raise ValueError("code out of range") + key = (module, name) + if (_extension_registry.get(key) == code and + _inverted_registry.get(code) == key): + return # Redundant registrations are benign + if key in _extension_registry: + raise ValueError("key %s is already registered with code %s" % + (key, _extension_registry[key])) + if code in _inverted_registry: + raise ValueError("code %s is already in use for key %s" % + (code, _inverted_registry[code])) + _extension_registry[key] = code + _inverted_registry[code] = key + +def remove_extension(module, name, code): + """Unregister an extension code. For testing only.""" + key = (module, name) + if (_extension_registry.get(key) != code or + _inverted_registry.get(code) != key): + raise ValueError("key %s is not registered with code %s" % + (key, code)) + del _extension_registry[key] + del _inverted_registry[code] + if code in _extension_cache: + del _extension_cache[code] + +def clear_extension_cache(): + _extension_cache.clear() + +# Standard extension code assignments + +# Reserved ranges + +# First Last Count Purpose +# 1 127 127 Reserved for Python standard library +# 128 191 64 Reserved for Zope +# 192 239 48 Reserved for 3rd parties +# 240 255 16 Reserved for private use (will never be assigned) +# 256 Inf Inf Reserved for future assignment + +# Extension codes are assigned by the Python Software Foundation. diff --git a/flaskwebproject/FlaskWebProject1/Lib/distutils/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/distutils/__init__.py new file mode 100644 index 0000000..59f55f1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/distutils/__init__.py @@ -0,0 +1,116 @@ +import imp +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 + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + # 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/flaskwebproject/FlaskWebProject1/Lib/distutils/distutils.cfg b/flaskwebproject/FlaskWebProject1/Lib/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/encodings/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/__init__.py new file mode 100644 index 0000000..aa2fb7c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/__init__.py @@ -0,0 +1,169 @@ +""" Standard "encodings" Package + + Standard Python encoding modules are stored in this package + directory. + + Codec modules must have names corresponding to normalized encoding + names as defined in the normalize_encoding() function below, e.g. + 'utf-8' must be implemented by the module 'utf_8.py'. + + Each codec module must export the following interface: + + * getregentry() -> codecs.CodecInfo object + The getregentry() API must return a CodecInfo object with encoder, decoder, + incrementalencoder, incrementaldecoder, streamwriter and streamreader + atttributes which adhere to the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be normalized encoding + names as defined by normalize_encoding(). + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs +import sys +from . import aliases + +_cache = {} +_unknown = '--unknown--' +_import_tail = ['*'] +_aliases = aliases.aliases + +class CodecRegistryError(LookupError, SystemError): + pass + +def normalize_encoding(encoding): + + """ Normalize an encoding name. + + Normalization works as follows: all non-alphanumeric + characters except the dot used for Python package names are + collapsed and replaced with a single underscore, e.g. ' -;#' + becomes '_'. Leading and trailing underscores are removed. + + Note that encoding names should be ASCII only; if they do use + non-ASCII characters, these must be Latin-1 compatible. + + """ + if isinstance(encoding, bytes): + encoding = str(encoding, "ascii") + + chars = [] + punct = False + for c in encoding: + if c.isalnum() or c == '.': + if punct and chars: + chars.append('_') + chars.append(c) + punct = False + else: + punct = True + return ''.join(chars) + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding, _unknown) + if entry is not _unknown: + return entry + + # Import the module: + # + # First try to find an alias for the normalized encoding + # name and lookup the module using the aliased name, then try to + # lookup the module using the standard import scheme, i.e. first + # try in the encodings package, then at top-level. + # + norm_encoding = normalize_encoding(encoding) + aliased_encoding = _aliases.get(norm_encoding) or \ + _aliases.get(norm_encoding.replace('.', '_')) + if aliased_encoding is not None: + modnames = [aliased_encoding, + norm_encoding] + else: + modnames = [norm_encoding] + for modname in modnames: + if not modname or '.' in modname: + continue + try: + # Import is absolute to prevent the possibly malicious import of a + # module with side-effects that is not in the 'encodings' package. + mod = __import__('encodings.' + modname, fromlist=_import_tail, + level=0) + except ImportError: + # ImportError may occur because 'encodings.(modname)' does not exist, + # or because it imports a name that does not exist (see mbcs and oem) + pass + else: + break + else: + mod = None + + try: + getregentry = mod.getregentry + except AttributeError: + # Not a codec module + mod = None + + if mod is None: + # Cache misses + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + entry = getregentry() + if not isinstance(entry, codecs.CodecInfo): + if not 4 <= len(entry) <= 7: + raise CodecRegistryError('module "%s" (%s) failed to register' + % (mod.__name__, mod.__file__)) + if not callable(entry[0]) or not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): + raise CodecRegistryError('incompatible codecs in module "%s" (%s)' + % (mod.__name__, mod.__file__)) + if len(entry)<7 or entry[6] is None: + entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],) + entry = codecs.CodecInfo(*entry) + + # Cache the codec registry entry + _cache[encoding] = entry + + # Register its aliases (without overwriting previously registered + # aliases) + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + if alias not in _aliases: + _aliases[alias] = modname + + # Return the registry entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) + +if sys.platform == 'win32': + def _alias_mbcs(encoding): + try: + import _bootlocale + if encoding == _bootlocale.getpreferredencoding(False): + import encodings.mbcs + return encodings.mbcs.getregentry() + except ImportError: + # Imports may fail while we are shutting down + pass + + codecs.register(_alias_mbcs) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/aliases.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/aliases.py new file mode 100644 index 0000000..2e63c2f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/aliases.py @@ -0,0 +1,550 @@ +""" Encoding Aliases Support + + This module is used by the encodings package search function to + map encodings names to module names. + + Note that the search function normalizes the encoding names before + doing the lookup, so the mapping will have to map normalized + encoding names to module names. + + Contents: + + The following aliases dictionary contains mappings of all IANA + character set names for which the Python core library provides + codecs. In addition to these, a few Python specific codec + aliases have also been added. + +""" +aliases = { + + # Please keep this list sorted alphabetically by value ! + + # ascii codec + '646' : 'ascii', + 'ansi_x3.4_1968' : 'ascii', + 'ansi_x3_4_1968' : 'ascii', # some email headers use this non-standard name + 'ansi_x3.4_1986' : 'ascii', + 'cp367' : 'ascii', + 'csascii' : 'ascii', + 'ibm367' : 'ascii', + 'iso646_us' : 'ascii', + 'iso_646.irv_1991' : 'ascii', + 'iso_ir_6' : 'ascii', + 'us' : 'ascii', + 'us_ascii' : 'ascii', + + # base64_codec codec + 'base64' : 'base64_codec', + 'base_64' : 'base64_codec', + + # big5 codec + 'big5_tw' : 'big5', + 'csbig5' : 'big5', + + # big5hkscs codec + 'big5_hkscs' : 'big5hkscs', + 'hkscs' : 'big5hkscs', + + # bz2_codec codec + 'bz2' : 'bz2_codec', + + # cp037 codec + '037' : 'cp037', + 'csibm037' : 'cp037', + 'ebcdic_cp_ca' : 'cp037', + 'ebcdic_cp_nl' : 'cp037', + 'ebcdic_cp_us' : 'cp037', + 'ebcdic_cp_wt' : 'cp037', + 'ibm037' : 'cp037', + 'ibm039' : 'cp037', + + # cp1026 codec + '1026' : 'cp1026', + 'csibm1026' : 'cp1026', + 'ibm1026' : 'cp1026', + + # cp1125 codec + '1125' : 'cp1125', + 'ibm1125' : 'cp1125', + 'cp866u' : 'cp1125', + 'ruscii' : 'cp1125', + + # cp1140 codec + '1140' : 'cp1140', + 'ibm1140' : 'cp1140', + + # cp1250 codec + '1250' : 'cp1250', + 'windows_1250' : 'cp1250', + + # cp1251 codec + '1251' : 'cp1251', + 'windows_1251' : 'cp1251', + + # cp1252 codec + '1252' : 'cp1252', + 'windows_1252' : 'cp1252', + + # cp1253 codec + '1253' : 'cp1253', + 'windows_1253' : 'cp1253', + + # cp1254 codec + '1254' : 'cp1254', + 'windows_1254' : 'cp1254', + + # cp1255 codec + '1255' : 'cp1255', + 'windows_1255' : 'cp1255', + + # cp1256 codec + '1256' : 'cp1256', + 'windows_1256' : 'cp1256', + + # cp1257 codec + '1257' : 'cp1257', + 'windows_1257' : 'cp1257', + + # cp1258 codec + '1258' : 'cp1258', + 'windows_1258' : 'cp1258', + + # cp273 codec + '273' : 'cp273', + 'ibm273' : 'cp273', + 'csibm273' : 'cp273', + + # cp424 codec + '424' : 'cp424', + 'csibm424' : 'cp424', + 'ebcdic_cp_he' : 'cp424', + 'ibm424' : 'cp424', + + # cp437 codec + '437' : 'cp437', + 'cspc8codepage437' : 'cp437', + 'ibm437' : 'cp437', + + # cp500 codec + '500' : 'cp500', + 'csibm500' : 'cp500', + 'ebcdic_cp_be' : 'cp500', + 'ebcdic_cp_ch' : 'cp500', + 'ibm500' : 'cp500', + + # cp775 codec + '775' : 'cp775', + 'cspc775baltic' : 'cp775', + 'ibm775' : 'cp775', + + # cp850 codec + '850' : 'cp850', + 'cspc850multilingual' : 'cp850', + 'ibm850' : 'cp850', + + # cp852 codec + '852' : 'cp852', + 'cspcp852' : 'cp852', + 'ibm852' : 'cp852', + + # cp855 codec + '855' : 'cp855', + 'csibm855' : 'cp855', + 'ibm855' : 'cp855', + + # cp857 codec + '857' : 'cp857', + 'csibm857' : 'cp857', + 'ibm857' : 'cp857', + + # cp858 codec + '858' : 'cp858', + 'csibm858' : 'cp858', + 'ibm858' : 'cp858', + + # cp860 codec + '860' : 'cp860', + 'csibm860' : 'cp860', + 'ibm860' : 'cp860', + + # cp861 codec + '861' : 'cp861', + 'cp_is' : 'cp861', + 'csibm861' : 'cp861', + 'ibm861' : 'cp861', + + # cp862 codec + '862' : 'cp862', + 'cspc862latinhebrew' : 'cp862', + 'ibm862' : 'cp862', + + # cp863 codec + '863' : 'cp863', + 'csibm863' : 'cp863', + 'ibm863' : 'cp863', + + # cp864 codec + '864' : 'cp864', + 'csibm864' : 'cp864', + 'ibm864' : 'cp864', + + # cp865 codec + '865' : 'cp865', + 'csibm865' : 'cp865', + 'ibm865' : 'cp865', + + # cp866 codec + '866' : 'cp866', + 'csibm866' : 'cp866', + 'ibm866' : 'cp866', + + # cp869 codec + '869' : 'cp869', + 'cp_gr' : 'cp869', + 'csibm869' : 'cp869', + 'ibm869' : 'cp869', + + # cp932 codec + '932' : 'cp932', + 'ms932' : 'cp932', + 'mskanji' : 'cp932', + 'ms_kanji' : 'cp932', + + # cp949 codec + '949' : 'cp949', + 'ms949' : 'cp949', + 'uhc' : 'cp949', + + # cp950 codec + '950' : 'cp950', + 'ms950' : 'cp950', + + # euc_jis_2004 codec + 'jisx0213' : 'euc_jis_2004', + 'eucjis2004' : 'euc_jis_2004', + 'euc_jis2004' : 'euc_jis_2004', + + # euc_jisx0213 codec + 'eucjisx0213' : 'euc_jisx0213', + + # euc_jp codec + 'eucjp' : 'euc_jp', + 'ujis' : 'euc_jp', + 'u_jis' : 'euc_jp', + + # euc_kr codec + 'euckr' : 'euc_kr', + 'korean' : 'euc_kr', + 'ksc5601' : 'euc_kr', + 'ks_c_5601' : 'euc_kr', + 'ks_c_5601_1987' : 'euc_kr', + 'ksx1001' : 'euc_kr', + 'ks_x_1001' : 'euc_kr', + + # gb18030 codec + 'gb18030_2000' : 'gb18030', + + # gb2312 codec + 'chinese' : 'gb2312', + 'csiso58gb231280' : 'gb2312', + 'euc_cn' : 'gb2312', + 'euccn' : 'gb2312', + 'eucgb2312_cn' : 'gb2312', + 'gb2312_1980' : 'gb2312', + 'gb2312_80' : 'gb2312', + 'iso_ir_58' : 'gb2312', + + # gbk codec + '936' : 'gbk', + 'cp936' : 'gbk', + 'ms936' : 'gbk', + + # hex_codec codec + 'hex' : 'hex_codec', + + # hp_roman8 codec + 'roman8' : 'hp_roman8', + 'r8' : 'hp_roman8', + 'csHPRoman8' : 'hp_roman8', + + # hz codec + 'hzgb' : 'hz', + 'hz_gb' : 'hz', + 'hz_gb_2312' : 'hz', + + # iso2022_jp codec + 'csiso2022jp' : 'iso2022_jp', + 'iso2022jp' : 'iso2022_jp', + 'iso_2022_jp' : 'iso2022_jp', + + # iso2022_jp_1 codec + 'iso2022jp_1' : 'iso2022_jp_1', + 'iso_2022_jp_1' : 'iso2022_jp_1', + + # iso2022_jp_2 codec + 'iso2022jp_2' : 'iso2022_jp_2', + 'iso_2022_jp_2' : 'iso2022_jp_2', + + # iso2022_jp_2004 codec + 'iso_2022_jp_2004' : 'iso2022_jp_2004', + 'iso2022jp_2004' : 'iso2022_jp_2004', + + # iso2022_jp_3 codec + 'iso2022jp_3' : 'iso2022_jp_3', + 'iso_2022_jp_3' : 'iso2022_jp_3', + + # iso2022_jp_ext codec + 'iso2022jp_ext' : 'iso2022_jp_ext', + 'iso_2022_jp_ext' : 'iso2022_jp_ext', + + # iso2022_kr codec + 'csiso2022kr' : 'iso2022_kr', + 'iso2022kr' : 'iso2022_kr', + 'iso_2022_kr' : 'iso2022_kr', + + # iso8859_10 codec + 'csisolatin6' : 'iso8859_10', + 'iso_8859_10' : 'iso8859_10', + 'iso_8859_10_1992' : 'iso8859_10', + 'iso_ir_157' : 'iso8859_10', + 'l6' : 'iso8859_10', + 'latin6' : 'iso8859_10', + + # iso8859_11 codec + 'thai' : 'iso8859_11', + 'iso_8859_11' : 'iso8859_11', + 'iso_8859_11_2001' : 'iso8859_11', + + # iso8859_13 codec + 'iso_8859_13' : 'iso8859_13', + 'l7' : 'iso8859_13', + 'latin7' : 'iso8859_13', + + # iso8859_14 codec + 'iso_8859_14' : 'iso8859_14', + 'iso_8859_14_1998' : 'iso8859_14', + 'iso_celtic' : 'iso8859_14', + 'iso_ir_199' : 'iso8859_14', + 'l8' : 'iso8859_14', + 'latin8' : 'iso8859_14', + + # iso8859_15 codec + 'iso_8859_15' : 'iso8859_15', + 'l9' : 'iso8859_15', + 'latin9' : 'iso8859_15', + + # iso8859_16 codec + 'iso_8859_16' : 'iso8859_16', + 'iso_8859_16_2001' : 'iso8859_16', + 'iso_ir_226' : 'iso8859_16', + 'l10' : 'iso8859_16', + 'latin10' : 'iso8859_16', + + # iso8859_2 codec + 'csisolatin2' : 'iso8859_2', + 'iso_8859_2' : 'iso8859_2', + 'iso_8859_2_1987' : 'iso8859_2', + 'iso_ir_101' : 'iso8859_2', + 'l2' : 'iso8859_2', + 'latin2' : 'iso8859_2', + + # iso8859_3 codec + 'csisolatin3' : 'iso8859_3', + 'iso_8859_3' : 'iso8859_3', + 'iso_8859_3_1988' : 'iso8859_3', + 'iso_ir_109' : 'iso8859_3', + 'l3' : 'iso8859_3', + 'latin3' : 'iso8859_3', + + # iso8859_4 codec + 'csisolatin4' : 'iso8859_4', + 'iso_8859_4' : 'iso8859_4', + 'iso_8859_4_1988' : 'iso8859_4', + 'iso_ir_110' : 'iso8859_4', + 'l4' : 'iso8859_4', + 'latin4' : 'iso8859_4', + + # iso8859_5 codec + 'csisolatincyrillic' : 'iso8859_5', + 'cyrillic' : 'iso8859_5', + 'iso_8859_5' : 'iso8859_5', + 'iso_8859_5_1988' : 'iso8859_5', + 'iso_ir_144' : 'iso8859_5', + + # iso8859_6 codec + 'arabic' : 'iso8859_6', + 'asmo_708' : 'iso8859_6', + 'csisolatinarabic' : 'iso8859_6', + 'ecma_114' : 'iso8859_6', + 'iso_8859_6' : 'iso8859_6', + 'iso_8859_6_1987' : 'iso8859_6', + 'iso_ir_127' : 'iso8859_6', + + # iso8859_7 codec + 'csisolatingreek' : 'iso8859_7', + 'ecma_118' : 'iso8859_7', + 'elot_928' : 'iso8859_7', + 'greek' : 'iso8859_7', + 'greek8' : 'iso8859_7', + 'iso_8859_7' : 'iso8859_7', + 'iso_8859_7_1987' : 'iso8859_7', + 'iso_ir_126' : 'iso8859_7', + + # iso8859_8 codec + 'csisolatinhebrew' : 'iso8859_8', + 'hebrew' : 'iso8859_8', + 'iso_8859_8' : 'iso8859_8', + 'iso_8859_8_1988' : 'iso8859_8', + 'iso_ir_138' : 'iso8859_8', + + # iso8859_9 codec + 'csisolatin5' : 'iso8859_9', + 'iso_8859_9' : 'iso8859_9', + 'iso_8859_9_1989' : 'iso8859_9', + 'iso_ir_148' : 'iso8859_9', + 'l5' : 'iso8859_9', + 'latin5' : 'iso8859_9', + + # johab codec + 'cp1361' : 'johab', + 'ms1361' : 'johab', + + # koi8_r codec + 'cskoi8r' : 'koi8_r', + + # kz1048 codec + 'kz_1048' : 'kz1048', + 'rk1048' : 'kz1048', + 'strk1048_2002' : 'kz1048', + + # latin_1 codec + # + # Note that the latin_1 codec is implemented internally in C and a + # lot faster than the charmap codec iso8859_1 which uses the same + # encoding. This is why we discourage the use of the iso8859_1 + # codec and alias it to latin_1 instead. + # + '8859' : 'latin_1', + 'cp819' : 'latin_1', + 'csisolatin1' : 'latin_1', + 'ibm819' : 'latin_1', + 'iso8859' : 'latin_1', + 'iso8859_1' : 'latin_1', + 'iso_8859_1' : 'latin_1', + 'iso_8859_1_1987' : 'latin_1', + 'iso_ir_100' : 'latin_1', + 'l1' : 'latin_1', + 'latin' : 'latin_1', + 'latin1' : 'latin_1', + + # mac_cyrillic codec + 'maccyrillic' : 'mac_cyrillic', + + # mac_greek codec + 'macgreek' : 'mac_greek', + + # mac_iceland codec + 'maciceland' : 'mac_iceland', + + # mac_latin2 codec + 'maccentraleurope' : 'mac_latin2', + 'maclatin2' : 'mac_latin2', + + # mac_roman codec + 'macintosh' : 'mac_roman', + 'macroman' : 'mac_roman', + + # mac_turkish codec + 'macturkish' : 'mac_turkish', + + # mbcs codec + 'ansi' : 'mbcs', + 'dbcs' : 'mbcs', + + # ptcp154 codec + 'csptcp154' : 'ptcp154', + 'pt154' : 'ptcp154', + 'cp154' : 'ptcp154', + 'cyrillic_asian' : 'ptcp154', + + # quopri_codec codec + 'quopri' : 'quopri_codec', + 'quoted_printable' : 'quopri_codec', + 'quotedprintable' : 'quopri_codec', + + # rot_13 codec + 'rot13' : 'rot_13', + + # shift_jis codec + 'csshiftjis' : 'shift_jis', + 'shiftjis' : 'shift_jis', + 'sjis' : 'shift_jis', + 's_jis' : 'shift_jis', + + # shift_jis_2004 codec + 'shiftjis2004' : 'shift_jis_2004', + 'sjis_2004' : 'shift_jis_2004', + 's_jis_2004' : 'shift_jis_2004', + + # shift_jisx0213 codec + 'shiftjisx0213' : 'shift_jisx0213', + 'sjisx0213' : 'shift_jisx0213', + 's_jisx0213' : 'shift_jisx0213', + + # tactis codec + 'tis260' : 'tactis', + + # tis_620 codec + 'tis620' : 'tis_620', + 'tis_620_0' : 'tis_620', + 'tis_620_2529_0' : 'tis_620', + 'tis_620_2529_1' : 'tis_620', + 'iso_ir_166' : 'tis_620', + + # utf_16 codec + 'u16' : 'utf_16', + 'utf16' : 'utf_16', + + # utf_16_be codec + 'unicodebigunmarked' : 'utf_16_be', + 'utf_16be' : 'utf_16_be', + + # utf_16_le codec + 'unicodelittleunmarked' : 'utf_16_le', + 'utf_16le' : 'utf_16_le', + + # utf_32 codec + 'u32' : 'utf_32', + 'utf32' : 'utf_32', + + # utf_32_be codec + 'utf_32be' : 'utf_32_be', + + # utf_32_le codec + 'utf_32le' : 'utf_32_le', + + # utf_7 codec + 'u7' : 'utf_7', + 'utf7' : 'utf_7', + 'unicode_1_1_utf_7' : 'utf_7', + + # utf_8 codec + 'u8' : 'utf_8', + 'utf' : 'utf_8', + 'utf8' : 'utf_8', + 'utf8_ucs2' : 'utf_8', + 'utf8_ucs4' : 'utf_8', + + # uu_codec codec + 'uu' : 'uu_codec', + + # zlib_codec codec + 'zip' : 'zlib_codec', + 'zlib' : 'zlib_codec', + + # temporary mac CJK aliases, will be replaced by proper codecs in 3.1 + 'x_mac_japanese' : 'shift_jis', + 'x_mac_korean' : 'euc_kr', + 'x_mac_simp_chinese' : 'gb2312', + 'x_mac_trad_chinese' : 'big5', +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/ascii.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/ascii.py new file mode 100644 index 0000000..2033cde --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/ascii.py @@ -0,0 +1,50 @@ +""" Python 'ascii' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.ascii_encode + decode = codecs.ascii_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.ascii_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.ascii_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.ascii_decode + decode = codecs.ascii_encode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='ascii', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/base64_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/base64_codec.py new file mode 100644 index 0000000..8e7703b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/base64_codec.py @@ -0,0 +1,55 @@ +"""Python 'base64_codec' Codec - base64 content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import base64 + +### Codec APIs + +def base64_encode(input, errors='strict'): + assert errors == 'strict' + return (base64.encodebytes(input), len(input)) + +def base64_decode(input, errors='strict'): + assert errors == 'strict' + return (base64.decodebytes(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return base64_encode(input, errors) + def decode(self, input, errors='strict'): + return base64_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return base64.encodebytes(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return base64.decodebytes(input) + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='base64', + encode=base64_encode, + decode=base64_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/big5.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/big5.py new file mode 100644 index 0000000..7adeb0e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/big5.py @@ -0,0 +1,39 @@ +# +# big5.py: Python Unicode Codec for BIG5 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('big5') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/big5hkscs.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/big5hkscs.py new file mode 100644 index 0000000..350df37 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/big5hkscs.py @@ -0,0 +1,39 @@ +# +# big5hkscs.py: Python Unicode Codec for BIG5HKSCS +# +# Written by Hye-Shik Chang +# + +import _codecs_hk, codecs +import _multibytecodec as mbc + +codec = _codecs_hk.getcodec('big5hkscs') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='big5hkscs', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/bz2_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/bz2_codec.py new file mode 100644 index 0000000..fd9495e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/bz2_codec.py @@ -0,0 +1,78 @@ +"""Python 'bz2_codec' Codec - bz2 compression encoding. + +This codec de/encodes from bytes to bytes and is therefore usable with +bytes.transform() and bytes.untransform(). + +Adapted by Raymond Hettinger from zlib_codec.py which was written +by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import bz2 # this codec needs the optional bz2 module ! + +### Codec APIs + +def bz2_encode(input, errors='strict'): + assert errors == 'strict' + return (bz2.compress(input), len(input)) + +def bz2_decode(input, errors='strict'): + assert errors == 'strict' + return (bz2.decompress(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return bz2_encode(input, errors) + def decode(self, input, errors='strict'): + return bz2_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = bz2.BZ2Compressor() + + def encode(self, input, final=False): + if final: + c = self.compressobj.compress(input) + return c + self.compressobj.flush() + else: + return self.compressobj.compress(input) + + def reset(self): + self.compressobj = bz2.BZ2Compressor() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = bz2.BZ2Decompressor() + + def decode(self, input, final=False): + try: + return self.decompressobj.decompress(input) + except EOFError: + return '' + + def reset(self): + self.decompressobj = bz2.BZ2Decompressor() + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name="bz2", + encode=bz2_encode, + decode=bz2_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/charmap.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/charmap.py new file mode 100644 index 0000000..81189b1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/charmap.py @@ -0,0 +1,69 @@ +""" Generic Python Character Mapping Codec. + + Use this codec directly rather than through the automatic + conversion mechanisms supplied by unicode() and .encode(). + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.charmap_encode + decode = codecs.charmap_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalEncoder.__init__(self, errors) + self.mapping = mapping + + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, self.mapping)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalDecoder.__init__(self, errors) + self.mapping = mapping + + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, self.mapping)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamWriter.__init__(self,stream,errors) + self.mapping = mapping + + def encode(self,input,errors='strict'): + return Codec.encode(input,errors,self.mapping) + +class StreamReader(Codec,codecs.StreamReader): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamReader.__init__(self,stream,errors) + self.mapping = mapping + + def decode(self,input,errors='strict'): + return Codec.decode(input,errors,self.mapping) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='charmap', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp037.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp037.py new file mode 100644 index 0000000..4edd708 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp037.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp037 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp037', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1006.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1006.py new file mode 100644 index 0000000..a1221c3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1006.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1006 generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1006', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO + '\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE + '\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO + '\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE + '\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR + '\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE + '\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX + '\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN + '\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT + '\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE + '\u060c' # 0xAB -> ARABIC COMMA + '\u061b' # 0xAC -> ARABIC SEMICOLON + '\xad' # 0xAD -> SOFT HYPHEN + '\u061f' # 0xAE -> ARABIC QUESTION MARK + '\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM + '\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM + '\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM + '\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM + '\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM + '\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM + '\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM + '\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM + '\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM + '\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM + '\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM + '\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM + '\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM + '\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM + '\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM + '\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM + '\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM + '\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN + '\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM + '\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM + '\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM + '\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM + '\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM + '\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM + '\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM + '\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM + '\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM + '\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM + '\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM + '\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM + '\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM + '\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM + '\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM + '\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM + '\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM + '\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM + '\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM + '\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM + '\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM + '\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM + '\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM + '\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM + '\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM + '\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM + '\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM + '\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM + '\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM + '\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM + '\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM + '\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + '\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + '\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + '\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM + '\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM + '\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM + '\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + '\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM + '\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM + '\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1026.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1026.py new file mode 100644 index 0000000..46f71f7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1026.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1026', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '{' # 0x48 -> LEFT CURLY BRACKET + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE + '\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '[' # 0x68 -> LEFT SQUARE BRACKET + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I + ':' # 0x7A -> COLON + '\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '}' # 0x8C -> RIGHT CURLY BRACKET + '`' # 0x8D -> GRAVE ACCENT + '\xa6' # 0x8E -> BROKEN BAR + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + ']' # 0xAC -> RIGHT SQUARE BRACKET + '$' # 0xAD -> DOLLAR SIGN + '@' # 0xAE -> COMMERCIAL AT + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '~' # 0xCC -> TILDE + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\\' # 0xDC -> REVERSE SOLIDUS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '#' # 0xEC -> NUMBER SIGN + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '"' # 0xFC -> QUOTATION MARK + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1125.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1125.py new file mode 100644 index 0000000..b1fd69d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1125.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP1125 + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1125', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0490, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x00f3: 0x0491, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x00f4: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f5: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f6: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f7: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f8: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f9: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0490' # 0x00f2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\u0491' # 0x00f3 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0404' # 0x00f4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f5 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0406' # 0x00f6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0x00f7 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0x00f8 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f9 -> CYRILLIC SMALL LETTER YI + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0406: 0x00f6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x00f8, # CYRILLIC CAPITAL LETTER YI + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f5, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0456: 0x00f7, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x00f9, # CYRILLIC SMALL LETTER YI + 0x0490: 0x00f2, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x0491: 0x00f3, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x2116: 0x00fc, # NUMERO SIGN + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1140.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1140.py new file mode 100644 index 0000000..0a919d8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1140.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1140', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\u20ac' # 0x9F -> EURO SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1250.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1250.py new file mode 100644 index 0000000..c2c83aa --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1250.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1250', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE + '\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u02c7' # 0xA1 -> CARON + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1251.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1251.py new file mode 100644 index 0000000..22bc660 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1251.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1251', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE + '\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE + '\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE + '\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE + '\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1252.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1252.py new file mode 100644 index 0000000..c0e8088 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1252.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1252', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1253.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1253.py new file mode 100644 index 0000000..ec9c097 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1253.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1253 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1253', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' # 0xD2 -> UNDEFINED + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1254.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1254.py new file mode 100644 index 0000000..4912327 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1254.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1254', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1255.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1255.py new file mode 100644 index 0000000..91ce26b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1255.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1255', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20aa' # 0xA4 -> NEW SHEQEL SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\u05b0' # 0xC0 -> HEBREW POINT SHEVA + '\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL + '\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH + '\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS + '\u05b4' # 0xC4 -> HEBREW POINT HIRIQ + '\u05b5' # 0xC5 -> HEBREW POINT TSERE + '\u05b6' # 0xC6 -> HEBREW POINT SEGOL + '\u05b7' # 0xC7 -> HEBREW POINT PATAH + '\u05b8' # 0xC8 -> HEBREW POINT QAMATS + '\u05b9' # 0xC9 -> HEBREW POINT HOLAM + '\ufffe' # 0xCA -> UNDEFINED + '\u05bb' # 0xCB -> HEBREW POINT QUBUTS + '\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ + '\u05bd' # 0xCD -> HEBREW POINT METEG + '\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF + '\u05bf' # 0xCF -> HEBREW POINT RAFE + '\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ + '\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT + '\u05c2' # 0xD2 -> HEBREW POINT SIN DOT + '\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ + '\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV + '\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD + '\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD + '\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH + '\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM + '\ufffe' # 0xD9 -> UNDEFINED + '\ufffe' # 0xDA -> UNDEFINED + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1256.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1256.py new file mode 100644 index 0000000..fd6afab --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1256.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1256 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1256', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\u067e' # 0x81 -> ARABIC LETTER PEH + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0679' # 0x8A -> ARABIC LETTER TTEH + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u0686' # 0x8D -> ARABIC LETTER TCHEH + '\u0698' # 0x8E -> ARABIC LETTER JEH + '\u0688' # 0x8F -> ARABIC LETTER DDAL + '\u06af' # 0x90 -> ARABIC LETTER GAF + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u06a9' # 0x98 -> ARABIC LETTER KEHEH + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0691' # 0x9A -> ARABIC LETTER RREH + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\u200c' # 0x9D -> ZERO WIDTH NON-JOINER + '\u200d' # 0x9E -> ZERO WIDTH JOINER + '\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u060c' # 0xA1 -> ARABIC COMMA + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u061b' # 0xBA -> ARABIC SEMICOLON + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0637' # 0xD8 -> ARABIC LETTER TAH + '\u0638' # 0xD9 -> ARABIC LETTER ZAH + '\u0639' # 0xDA -> ARABIC LETTER AIN + '\u063a' # 0xDB -> ARABIC LETTER GHAIN + '\u0640' # 0xDC -> ARABIC TATWEEL + '\u0641' # 0xDD -> ARABIC LETTER FEH + '\u0642' # 0xDE -> ARABIC LETTER QAF + '\u0643' # 0xDF -> ARABIC LETTER KAF + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\u0644' # 0xE1 -> ARABIC LETTER LAM + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0645' # 0xE3 -> ARABIC LETTER MEEM + '\u0646' # 0xE4 -> ARABIC LETTER NOON + '\u0647' # 0xE5 -> ARABIC LETTER HEH + '\u0648' # 0xE6 -> ARABIC LETTER WAW + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xED -> ARABIC LETTER YEH + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u064b' # 0xF0 -> ARABIC FATHATAN + '\u064c' # 0xF1 -> ARABIC DAMMATAN + '\u064d' # 0xF2 -> ARABIC KASRATAN + '\u064e' # 0xF3 -> ARABIC FATHA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0651' # 0xF8 -> ARABIC SHADDA + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\u0652' # 0xFA -> ARABIC SUKUN + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1257.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1257.py new file mode 100644 index 0000000..9ebc90d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1257.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1257 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1257', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\xa8' # 0x8D -> DIAERESIS + '\u02c7' # 0x8E -> CARON + '\xb8' # 0x8F -> CEDILLA + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\xaf' # 0x9D -> MACRON + '\u02db' # 0x9E -> OGONEK + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' # 0xA1 -> UNDEFINED + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' # 0xA5 -> UNDEFINED + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1258.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1258.py new file mode 100644 index 0000000..784378a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp1258.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1258 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp1258', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0300' # 0xCC -> COMBINING GRAVE ACCENT + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\u0309' # 0xD2 -> COMBINING HOOK ABOVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN + '\u0303' # 0xDE -> COMBINING TILDE + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0301' # 0xEC -> COMBINING ACUTE ACCENT + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\u0323' # 0xF2 -> COMBINING DOT BELOW + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN + '\u20ab' # 0xFE -> DONG SIGN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp273.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp273.py new file mode 100644 index 0000000..69c6d77 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp273.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp273 generated from 'python-mappings/CP273.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp273', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL (NUL) + '\x01' # 0x01 -> START OF HEADING (SOH) + '\x02' # 0x02 -> START OF TEXT (STX) + '\x03' # 0x03 -> END OF TEXT (ETX) + '\x9c' # 0x04 -> STRING TERMINATOR (ST) + '\t' # 0x05 -> CHARACTER TABULATION (HT) + '\x86' # 0x06 -> START OF SELECTED AREA (SSA) + '\x7f' # 0x07 -> DELETE (DEL) + '\x97' # 0x08 -> END OF GUARDED AREA (EPA) + '\x8d' # 0x09 -> REVERSE LINE FEED (RI) + '\x8e' # 0x0A -> SINGLE-SHIFT TWO (SS2) + '\x0b' # 0x0B -> LINE TABULATION (VT) + '\x0c' # 0x0C -> FORM FEED (FF) + '\r' # 0x0D -> CARRIAGE RETURN (CR) + '\x0e' # 0x0E -> SHIFT OUT (SO) + '\x0f' # 0x0F -> SHIFT IN (SI) + '\x10' # 0x10 -> DATALINK ESCAPE (DLE) + '\x11' # 0x11 -> DEVICE CONTROL ONE (DC1) + '\x12' # 0x12 -> DEVICE CONTROL TWO (DC2) + '\x13' # 0x13 -> DEVICE CONTROL THREE (DC3) + '\x9d' # 0x14 -> OPERATING SYSTEM COMMAND (OSC) + '\x85' # 0x15 -> NEXT LINE (NEL) + '\x08' # 0x16 -> BACKSPACE (BS) + '\x87' # 0x17 -> END OF SELECTED AREA (ESA) + '\x18' # 0x18 -> CANCEL (CAN) + '\x19' # 0x19 -> END OF MEDIUM (EM) + '\x92' # 0x1A -> PRIVATE USE TWO (PU2) + '\x8f' # 0x1B -> SINGLE-SHIFT THREE (SS3) + '\x1c' # 0x1C -> FILE SEPARATOR (IS4) + '\x1d' # 0x1D -> GROUP SEPARATOR (IS3) + '\x1e' # 0x1E -> RECORD SEPARATOR (IS2) + '\x1f' # 0x1F -> UNIT SEPARATOR (IS1) + '\x80' # 0x20 -> PADDING CHARACTER (PAD) + '\x81' # 0x21 -> HIGH OCTET PRESET (HOP) + '\x82' # 0x22 -> BREAK PERMITTED HERE (BPH) + '\x83' # 0x23 -> NO BREAK HERE (NBH) + '\x84' # 0x24 -> INDEX (IND) + '\n' # 0x25 -> LINE FEED (LF) + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK (ETB) + '\x1b' # 0x27 -> ESCAPE (ESC) + '\x88' # 0x28 -> CHARACTER TABULATION SET (HTS) + '\x89' # 0x29 -> CHARACTER TABULATION WITH JUSTIFICATION (HTJ) + '\x8a' # 0x2A -> LINE TABULATION SET (VTS) + '\x8b' # 0x2B -> PARTIAL LINE FORWARD (PLD) + '\x8c' # 0x2C -> PARTIAL LINE BACKWARD (PLU) + '\x05' # 0x2D -> ENQUIRY (ENQ) + '\x06' # 0x2E -> ACKNOWLEDGE (ACK) + '\x07' # 0x2F -> BELL (BEL) + '\x90' # 0x30 -> DEVICE CONTROL STRING (DCS) + '\x91' # 0x31 -> PRIVATE USE ONE (PU1) + '\x16' # 0x32 -> SYNCHRONOUS IDLE (SYN) + '\x93' # 0x33 -> SET TRANSMIT STATE (STS) + '\x94' # 0x34 -> CANCEL CHARACTER (CCH) + '\x95' # 0x35 -> MESSAGE WAITING (MW) + '\x96' # 0x36 -> START OF GUARDED AREA (SPA) + '\x04' # 0x37 -> END OF TRANSMISSION (EOT) + '\x98' # 0x38 -> START OF STRING (SOS) + '\x99' # 0x39 -> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) + '\x9a' # 0x3A -> SINGLE CHARACTER INTRODUCER (SCI) + '\x9b' # 0x3B -> CONTROL SEQUENCE INTRODUCER (CSI) + '\x14' # 0x3C -> DEVICE CONTROL FOUR (DC4) + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE (NAK) + '\x9e' # 0x3E -> PRIVACY MESSAGE (PM) + '\x1a' # 0x3F -> SUBSTITUTE (SUB) + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '{' # 0x43 -> LEFT CURLY BRACKET + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc4' # 0x4A -> LATIN CAPITAL LETTER A WITH DIAERESIS + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '~' # 0x59 -> TILDE + '\xdc' # 0x5A -> LATIN CAPITAL LETTER U WITH DIAERESIS + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '[' # 0x63 -> LEFT SQUARE BRACKET + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf6' # 0x6A -> LATIN SMALL LETTER O WITH DIAERESIS + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '\xa7' # 0x7C -> SECTION SIGN + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (Icelandic) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (Icelandic) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LETTER AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LETTER AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xdf' # 0xA1 -> LATIN SMALL LETTER SHARP S (German) + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '@' # 0xB5 -> COMMERCIAL AT + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\u203e' # 0xBC -> OVERLINE + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe4' # 0xC0 -> LATIN SMALL LETTER A WITH DIAERESIS + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa6' # 0xCC -> BROKEN BAR + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\xfc' # 0xD0 -> LATIN SMALL LETTER U WITH DIAERESIS + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '}' # 0xDC -> RIGHT CURLY BRACKET + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0xE0 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\\' # 0xEC -> REVERSE SOLIDUS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + ']' # 0xFC -> RIGHT SQUARE BRACKET + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> APPLICATION PROGRAM COMMAND (APC) +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp424.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp424.py new file mode 100644 index 0000000..6753daf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp424.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp424 generated from 'MAPPINGS/VENDORS/MISC/CP424.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp424', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> SELECT + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> REQUIRED NEW LINE + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> GRAPHIC ESCAPE + '\x8d' # 0x09 -> SUPERSCRIPT + '\x8e' # 0x0A -> REPEAT + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION + '\x85' # 0x15 -> NEW LINE + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> UNIT BACK SPACE + '\x8f' # 0x1B -> CUSTOMER USE ONE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> DIGIT SELECT + '\x81' # 0x21 -> START OF SIGNIFICANCE + '\x82' # 0x22 -> FIELD SEPARATOR + '\x83' # 0x23 -> WORD UNDERSCORE + '\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> SET ATTRIBUTE + '\x89' # 0x29 -> START FIELD EXTENDED + '\x8a' # 0x2A -> SET MODE OR SWITCH + '\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX + '\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> + '\x91' # 0x31 -> + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> INDEX RETURN + '\x94' # 0x34 -> PRESENTATION POSITION + '\x95' # 0x35 -> TRANSPARENT + '\x96' # 0x36 -> NUMERIC BACKSPACE + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> SUBSCRIPT + '\x99' # 0x39 -> INDENT TABULATION + '\x9a' # 0x3A -> REVERSE FORM FEED + '\x9b' # 0x3B -> CUSTOMER USE THREE + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u05d0' # 0x41 -> HEBREW LETTER ALEF + '\u05d1' # 0x42 -> HEBREW LETTER BET + '\u05d2' # 0x43 -> HEBREW LETTER GIMEL + '\u05d3' # 0x44 -> HEBREW LETTER DALET + '\u05d4' # 0x45 -> HEBREW LETTER HE + '\u05d5' # 0x46 -> HEBREW LETTER VAV + '\u05d6' # 0x47 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x48 -> HEBREW LETTER HET + '\u05d8' # 0x49 -> HEBREW LETTER TET + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\u05d9' # 0x51 -> HEBREW LETTER YOD + '\u05da' # 0x52 -> HEBREW LETTER FINAL KAF + '\u05db' # 0x53 -> HEBREW LETTER KAF + '\u05dc' # 0x54 -> HEBREW LETTER LAMED + '\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM + '\u05de' # 0x56 -> HEBREW LETTER MEM + '\u05df' # 0x57 -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x58 -> HEBREW LETTER NUN + '\u05e1' # 0x59 -> HEBREW LETTER SAMEKH + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u05e2' # 0x62 -> HEBREW LETTER AYIN + '\u05e3' # 0x63 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x64 -> HEBREW LETTER PE + '\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x66 -> HEBREW LETTER TSADI + '\u05e7' # 0x67 -> HEBREW LETTER QOF + '\u05e8' # 0x68 -> HEBREW LETTER RESH + '\u05e9' # 0x69 -> HEBREW LETTER SHIN + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\ufffe' # 0x70 -> UNDEFINED + '\u05ea' # 0x71 -> HEBREW LETTER TAV + '\ufffe' # 0x72 -> UNDEFINED + '\ufffe' # 0x73 -> UNDEFINED + '\xa0' # 0x74 -> NO-BREAK SPACE + '\ufffe' # 0x75 -> UNDEFINED + '\ufffe' # 0x76 -> UNDEFINED + '\ufffe' # 0x77 -> UNDEFINED + '\u2017' # 0x78 -> DOUBLE LOW LINE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\ufffe' # 0x80 -> UNDEFINED + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\xb8' # 0x9D -> CEDILLA + '\ufffe' # 0x9E -> UNDEFINED + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\ufffe' # 0xAA -> UNDEFINED + '\ufffe' # 0xAB -> UNDEFINED + '\ufffe' # 0xAC -> UNDEFINED + '\ufffe' # 0xAD -> UNDEFINED + '\ufffe' # 0xAE -> UNDEFINED + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\ufffe' # 0xCB -> UNDEFINED + '\ufffe' # 0xCC -> UNDEFINED + '\ufffe' # 0xCD -> UNDEFINED + '\ufffe' # 0xCE -> UNDEFINED + '\ufffe' # 0xCF -> UNDEFINED + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\ufffe' # 0xEE -> UNDEFINED + '\ufffe' # 0xEF -> UNDEFINED + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\x9f' # 0xFF -> EIGHT ONES +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp437.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp437.py new file mode 100644 index 0000000..b6c75e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp437.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp437 generated from 'VENDORS/MICSFT/PC/CP437.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp437', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp500.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp500.py new file mode 100644 index 0000000..5f61535 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp500.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp500 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP500.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp500', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp65001.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp65001.py new file mode 100644 index 0000000..95cb2ae --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp65001.py @@ -0,0 +1,43 @@ +""" +Code page 65001: Windows UTF-8 (CP_UTF8). +""" + +import codecs +import functools + +if not hasattr(codecs, 'code_page_encode'): + raise LookupError("cp65001 encoding is only available on Windows") + +### Codec APIs + +encode = functools.partial(codecs.code_page_encode, 65001) +_decode = functools.partial(codecs.code_page_decode, 65001) + +def decode(input, errors='strict'): + return codecs.code_page_decode(65001, input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = _decode + +class StreamWriter(codecs.StreamWriter): + encode = encode + +class StreamReader(codecs.StreamReader): + decode = _decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp65001', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp720.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp720.py new file mode 100644 index 0000000..96d6096 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp720.py @@ -0,0 +1,309 @@ +"""Python Character Mapping Codec cp720 generated on Windows: +Vista 6.0.6002 SP2 Multiprocessor Free with the command: + python Tools/unicode/genwincodec.py 720 +"""#" + + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp720', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\x80' + '\x81' + '\xe9' # 0x82 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x83 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\x84' + '\xe0' # 0x85 -> LATIN SMALL LETTER A WITH GRAVE + '\x86' + '\xe7' # 0x87 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x88 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x89 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x8A -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x8B -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x8C -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\x8d' + '\x8e' + '\x8f' + '\x90' + '\u0651' # 0x91 -> ARABIC SHADDA + '\u0652' # 0x92 -> ARABIC SUKUN + '\xf4' # 0x93 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa4' # 0x94 -> CURRENCY SIGN + '\u0640' # 0x95 -> ARABIC TATWEEL + '\xfb' # 0x96 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x97 -> LATIN SMALL LETTER U WITH GRAVE + '\u0621' # 0x98 -> ARABIC LETTER HAMZA + '\u0622' # 0x99 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x9A -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x9B -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\xa3' # 0x9C -> POUND SIGN + '\u0625' # 0x9D -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x9E -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x9F -> ARABIC LETTER ALEF + '\u0628' # 0xA0 -> ARABIC LETTER BEH + '\u0629' # 0xA1 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xA2 -> ARABIC LETTER TEH + '\u062b' # 0xA3 -> ARABIC LETTER THEH + '\u062c' # 0xA4 -> ARABIC LETTER JEEM + '\u062d' # 0xA5 -> ARABIC LETTER HAH + '\u062e' # 0xA6 -> ARABIC LETTER KHAH + '\u062f' # 0xA7 -> ARABIC LETTER DAL + '\u0630' # 0xA8 -> ARABIC LETTER THAL + '\u0631' # 0xA9 -> ARABIC LETTER REH + '\u0632' # 0xAA -> ARABIC LETTER ZAIN + '\u0633' # 0xAB -> ARABIC LETTER SEEN + '\u0634' # 0xAC -> ARABIC LETTER SHEEN + '\u0635' # 0xAD -> ARABIC LETTER SAD + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0xB5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0xB6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0xB8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0xBD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0xBE -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0xC6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xC7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0xCF -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xD0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0xD1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xD2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0xD3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0xD4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0xD5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0xD6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0xD7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0xD8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\u258c' # 0xDD -> LEFT HALF BLOCK + '\u2590' # 0xDE -> RIGHT HALF BLOCK + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\u0636' # 0xE0 -> ARABIC LETTER DAD + '\u0637' # 0xE1 -> ARABIC LETTER TAH + '\u0638' # 0xE2 -> ARABIC LETTER ZAH + '\u0639' # 0xE3 -> ARABIC LETTER AIN + '\u063a' # 0xE4 -> ARABIC LETTER GHAIN + '\u0641' # 0xE5 -> ARABIC LETTER FEH + '\xb5' # 0xE6 -> MICRO SIGN + '\u0642' # 0xE7 -> ARABIC LETTER QAF + '\u0643' # 0xE8 -> ARABIC LETTER KAF + '\u0644' # 0xE9 -> ARABIC LETTER LAM + '\u0645' # 0xEA -> ARABIC LETTER MEEM + '\u0646' # 0xEB -> ARABIC LETTER NOON + '\u0647' # 0xEC -> ARABIC LETTER HEH + '\u0648' # 0xED -> ARABIC LETTER WAW + '\u0649' # 0xEE -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEF -> ARABIC LETTER YEH + '\u2261' # 0xF0 -> IDENTICAL TO + '\u064b' # 0xF1 -> ARABIC FATHATAN + '\u064c' # 0xF2 -> ARABIC DAMMATAN + '\u064d' # 0xF3 -> ARABIC KASRATAN + '\u064e' # 0xF4 -> ARABIC FATHA + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\u2248' # 0xF7 -> ALMOST EQUAL TO + '\xb0' # 0xF8 -> DEGREE SIGN + '\u2219' # 0xF9 -> BULLET OPERATOR + '\xb7' # 0xFA -> MIDDLE DOT + '\u221a' # 0xFB -> SQUARE ROOT + '\u207f' # 0xFC -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp737.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp737.py new file mode 100644 index 0000000..9685bae --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp737.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp737 generated from 'VENDORS/MICSFT/PC/CP737.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp737', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x008b -> GREEK CAPITAL LETTER MU + '\u039d' # 0x008c -> GREEK CAPITAL LETTER NU + '\u039e' # 0x008d -> GREEK CAPITAL LETTER XI + '\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x009e -> GREEK SMALL LETTER ETA + '\u03b8' # 0x009f -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU + '\u03be' # 0x00a5 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI + '\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU + '\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI + '\u03c8' # 0x00af -> GREEK SMALL LETTER PSI + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA + '\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00f7: 0x00f6, # DIVISION SIGN + 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA + 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA + 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA + 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x008b, # GREEK CAPITAL LETTER MU + 0x039d: 0x008c, # GREEK CAPITAL LETTER NU + 0x039e: 0x008d, # GREEK CAPITAL LETTER XI + 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI + 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x0099, # GREEK SMALL LETTER BETA + 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA + 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA + 0x03b7: 0x009e, # GREEK SMALL LETTER ETA + 0x03b8: 0x009f, # GREEK SMALL LETTER THETA + 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00a3, # GREEK SMALL LETTER MU + 0x03bd: 0x00a4, # GREEK SMALL LETTER NU + 0x03be: 0x00a5, # GREEK SMALL LETTER XI + 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00a7, # GREEK SMALL LETTER PI + 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO + 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU + 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI + 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI + 0x03c8: 0x00af, # GREEK SMALL LETTER PSI + 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp775.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp775.py new file mode 100644 index 0000000..fe06e7b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp775.py @@ -0,0 +1,697 @@ +""" Python Character Mapping Codec cp775 generated from 'VENDORS/MICSFT/PC/CP775.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp775', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0096: 0x00a2, # CENT SIGN + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a7: 0x00a6, # BROKEN BAR + 0x00a8: 0x00a9, # COPYRIGHT SIGN + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON + '\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA + '\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\xa2' # 0x0096 -> CENT SIGN + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\xa4' # 0x009f -> CURRENCY SIGN + '\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON + '\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE + '\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK + '\xa6' # 0x00a7 -> BROKEN BAR + '\xa9' # 0x00a8 -> COPYRIGHT SIGN + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON + '\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON + '\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK + '\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON + '\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK + '\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK + '\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON + '\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK + '\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON + '\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE + '\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA + '\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA + '\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA + '\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON + '\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x0096, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x009f, # CURRENCY SIGN + 0x00a6: 0x00a7, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a9: 0x00a8, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA + 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON + 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA + 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA + 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON + 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON + 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK + 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK + 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK + 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK + 0x2219: 0x00f9, # BULLET OPERATOR + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp850.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp850.py new file mode 100644 index 0000000..f98aef9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp850.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP850.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp850', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp852.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp852.py new file mode 100644 index 0000000..34d8a0e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp852.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP852.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp852', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00f2: 0x02db, # OGONEK + 0x00f3: 0x02c7, # CARON + 0x00f4: 0x02d8, # BREVE + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON + '\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK + '\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON + '\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK + '\xac' # 0x00aa -> NOT SIGN + '\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE + '\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON + '\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON + '\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE + '\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE + '\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE + '\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON + '\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA + '\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON + '\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON + '\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE + '\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT + '\u02db' # 0x00f2 -> OGONEK + '\u02c7' # 0x00f3 -> CARON + '\u02d8' # 0x00f4 -> BREVE + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u02d9' # 0x00fa -> DOT ABOVE + '\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON + '\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b8: 0x00f7, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON + 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON + 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK + 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON + 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE + 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON + 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON + 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON + 0x02c7: 0x00f3, # CARON + 0x02d8: 0x00f4, # BREVE + 0x02d9: 0x00fa, # DOT ABOVE + 0x02db: 0x00f2, # OGONEK + 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp855.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp855.py new file mode 100644 index 0000000..4fe9210 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp855.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP855.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp855', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE + '\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE + '\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE + '\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE + '\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO + '\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO + '\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE + '\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE + '\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI + '\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI + '\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE + '\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE + '\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE + '\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE + '\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE + '\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE + '\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE + '\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE + '\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE + '\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE + '\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U + '\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE + '\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE + '\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU + '\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU + '\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN + '\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A + '\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE + '\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE + '\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE + '\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE + '\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE + '\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE + '\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE + '\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE + '\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF + '\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF + '\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE + '\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA + '\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA + '\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I + '\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I + '\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA + '\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL + '\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL + '\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM + '\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM + '\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN + '\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN + '\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O + '\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O + '\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE + '\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA + '\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER + '\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER + '\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES + '\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES + '\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE + '\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE + '\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U + '\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U + '\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE + '\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE + '\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE + '\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE + '\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN + '\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u2116' # 0x00ef -> NUMERO SIGN + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU + '\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU + '\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE + '\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE + '\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA + '\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA + '\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E + '\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E + '\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA + '\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA + '\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE + '\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE + '\xa7' # 0x00fd -> SECTION SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00fd, # SECTION SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE + 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE + 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE + 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE + 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U + 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I + 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O + 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U + 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E + 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA + 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO + 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE + 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE + 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI + 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE + 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE + 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE + 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE + 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE + 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U + 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0x00ef, # NUMERO SIGN + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp856.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp856.py new file mode 100644 index 0000000..cacbfb2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp856.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp856 generated from 'MAPPINGS/VENDORS/MISC/CP856.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp856', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u05d0' # 0x80 -> HEBREW LETTER ALEF + '\u05d1' # 0x81 -> HEBREW LETTER BET + '\u05d2' # 0x82 -> HEBREW LETTER GIMEL + '\u05d3' # 0x83 -> HEBREW LETTER DALET + '\u05d4' # 0x84 -> HEBREW LETTER HE + '\u05d5' # 0x85 -> HEBREW LETTER VAV + '\u05d6' # 0x86 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x87 -> HEBREW LETTER HET + '\u05d8' # 0x88 -> HEBREW LETTER TET + '\u05d9' # 0x89 -> HEBREW LETTER YOD + '\u05da' # 0x8A -> HEBREW LETTER FINAL KAF + '\u05db' # 0x8B -> HEBREW LETTER KAF + '\u05dc' # 0x8C -> HEBREW LETTER LAMED + '\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM + '\u05de' # 0x8E -> HEBREW LETTER MEM + '\u05df' # 0x8F -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x90 -> HEBREW LETTER NUN + '\u05e1' # 0x91 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x92 -> HEBREW LETTER AYIN + '\u05e3' # 0x93 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x94 -> HEBREW LETTER PE + '\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x96 -> HEBREW LETTER TSADI + '\u05e7' # 0x97 -> HEBREW LETTER QOF + '\u05e8' # 0x98 -> HEBREW LETTER RESH + '\u05e9' # 0x99 -> HEBREW LETTER SHIN + '\u05ea' # 0x9A -> HEBREW LETTER TAV + '\ufffe' # 0x9B -> UNDEFINED + '\xa3' # 0x9C -> POUND SIGN + '\ufffe' # 0x9D -> UNDEFINED + '\xd7' # 0x9E -> MULTIPLICATION SIGN + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\ufffe' # 0xA1 -> UNDEFINED + '\ufffe' # 0xA2 -> UNDEFINED + '\ufffe' # 0xA3 -> UNDEFINED + '\ufffe' # 0xA4 -> UNDEFINED + '\ufffe' # 0xA5 -> UNDEFINED + '\ufffe' # 0xA6 -> UNDEFINED + '\ufffe' # 0xA7 -> UNDEFINED + '\ufffe' # 0xA8 -> UNDEFINED + '\xae' # 0xA9 -> REGISTERED SIGN + '\xac' # 0xAA -> NOT SIGN + '\xbd' # 0xAB -> VULGAR FRACTION ONE HALF + '\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER + '\ufffe' # 0xAD -> UNDEFINED + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\ufffe' # 0xB5 -> UNDEFINED + '\ufffe' # 0xB6 -> UNDEFINED + '\ufffe' # 0xB7 -> UNDEFINED + '\xa9' # 0xB8 -> COPYRIGHT SIGN + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0xBD -> CENT SIGN + '\xa5' # 0xBE -> YEN SIGN + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\ufffe' # 0xC6 -> UNDEFINED + '\ufffe' # 0xC7 -> UNDEFINED + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0xCF -> CURRENCY SIGN + '\ufffe' # 0xD0 -> UNDEFINED + '\ufffe' # 0xD1 -> UNDEFINED + '\ufffe' # 0xD2 -> UNDEFINED + '\ufffe' # 0xD3 -> UNDEFINEDS + '\ufffe' # 0xD4 -> UNDEFINED + '\ufffe' # 0xD5 -> UNDEFINED + '\ufffe' # 0xD6 -> UNDEFINEDE + '\ufffe' # 0xD7 -> UNDEFINED + '\ufffe' # 0xD8 -> UNDEFINED + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\xa6' # 0xDD -> BROKEN BAR + '\ufffe' # 0xDE -> UNDEFINED + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\ufffe' # 0xE0 -> UNDEFINED + '\ufffe' # 0xE1 -> UNDEFINED + '\ufffe' # 0xE2 -> UNDEFINED + '\ufffe' # 0xE3 -> UNDEFINED + '\ufffe' # 0xE4 -> UNDEFINED + '\ufffe' # 0xE5 -> UNDEFINED + '\xb5' # 0xE6 -> MICRO SIGN + '\ufffe' # 0xE7 -> UNDEFINED + '\ufffe' # 0xE8 -> UNDEFINED + '\ufffe' # 0xE9 -> UNDEFINED + '\ufffe' # 0xEA -> UNDEFINED + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\xaf' # 0xEE -> MACRON + '\xb4' # 0xEF -> ACUTE ACCENT + '\xad' # 0xF0 -> SOFT HYPHEN + '\xb1' # 0xF1 -> PLUS-MINUS SIGN + '\u2017' # 0xF2 -> DOUBLE LOW LINE + '\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0xF4 -> PILCROW SIGN + '\xa7' # 0xF5 -> SECTION SIGN + '\xf7' # 0xF6 -> DIVISION SIGN + '\xb8' # 0xF7 -> CEDILLA + '\xb0' # 0xF8 -> DEGREE SIGN + '\xa8' # 0xF9 -> DIAERESIS + '\xb7' # 0xFA -> MIDDLE DOT + '\xb9' # 0xFB -> SUPERSCRIPT ONE + '\xb3' # 0xFC -> SUPERSCRIPT THREE + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp857.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp857.py new file mode 100644 index 0000000..741b059 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp857.py @@ -0,0 +1,694 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP857.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp857', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR + '\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\ufffe' # 0x00d5 -> UNDEFINED + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\ufffe' # 0x00e7 -> UNDEFINED + '\xd7' # 0x00e8 -> MULTIPLICATION SIGN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE + '\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\ufffe' # 0x00f2 -> UNDEFINED + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x00e8, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE + 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I + 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp858.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp858.py new file mode 100644 index 0000000..7579f52 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp858.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP858, modified from cp850. + +""" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp858', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x20ac, # EURO SIGN + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u20ac' # 0x00d5 -> EURO SIGN + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x20ac: 0x00d5, # EURO SIGN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp860.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp860.py new file mode 100644 index 0000000..65903e7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp860.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP860.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp860', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE + '\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\u20a7' # 0x009e -> PESETA SIGN + '\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp861.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp861.py new file mode 100644 index 0000000..860a05f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp861.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP861.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp861', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH + '\xf0' # 0x008c -> LATIN SMALL LETTER ETH + '\xde' # 0x008d -> LATIN CAPITAL LETTER THORN + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfe' # 0x0095 -> LATIN SMALL LETTER THORN + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH + 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f0: 0x008c, # LATIN SMALL LETTER ETH + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x0095, # LATIN SMALL LETTER THORN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp862.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp862.py new file mode 100644 index 0000000..3df22f9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp862.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP862.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp862', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u05d0' # 0x0080 -> HEBREW LETTER ALEF + '\u05d1' # 0x0081 -> HEBREW LETTER BET + '\u05d2' # 0x0082 -> HEBREW LETTER GIMEL + '\u05d3' # 0x0083 -> HEBREW LETTER DALET + '\u05d4' # 0x0084 -> HEBREW LETTER HE + '\u05d5' # 0x0085 -> HEBREW LETTER VAV + '\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x0087 -> HEBREW LETTER HET + '\u05d8' # 0x0088 -> HEBREW LETTER TET + '\u05d9' # 0x0089 -> HEBREW LETTER YOD + '\u05da' # 0x008a -> HEBREW LETTER FINAL KAF + '\u05db' # 0x008b -> HEBREW LETTER KAF + '\u05dc' # 0x008c -> HEBREW LETTER LAMED + '\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM + '\u05de' # 0x008e -> HEBREW LETTER MEM + '\u05df' # 0x008f -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x0090 -> HEBREW LETTER NUN + '\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x0092 -> HEBREW LETTER AYIN + '\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x0094 -> HEBREW LETTER PE + '\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x0096 -> HEBREW LETTER TSADI + '\u05e7' # 0x0097 -> HEBREW LETTER QOF + '\u05e8' # 0x0098 -> HEBREW LETTER RESH + '\u05e9' # 0x0099 -> HEBREW LETTER SHIN + '\u05ea' # 0x009a -> HEBREW LETTER TAV + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x05d0: 0x0080, # HEBREW LETTER ALEF + 0x05d1: 0x0081, # HEBREW LETTER BET + 0x05d2: 0x0082, # HEBREW LETTER GIMEL + 0x05d3: 0x0083, # HEBREW LETTER DALET + 0x05d4: 0x0084, # HEBREW LETTER HE + 0x05d5: 0x0085, # HEBREW LETTER VAV + 0x05d6: 0x0086, # HEBREW LETTER ZAYIN + 0x05d7: 0x0087, # HEBREW LETTER HET + 0x05d8: 0x0088, # HEBREW LETTER TET + 0x05d9: 0x0089, # HEBREW LETTER YOD + 0x05da: 0x008a, # HEBREW LETTER FINAL KAF + 0x05db: 0x008b, # HEBREW LETTER KAF + 0x05dc: 0x008c, # HEBREW LETTER LAMED + 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM + 0x05de: 0x008e, # HEBREW LETTER MEM + 0x05df: 0x008f, # HEBREW LETTER FINAL NUN + 0x05e0: 0x0090, # HEBREW LETTER NUN + 0x05e1: 0x0091, # HEBREW LETTER SAMEKH + 0x05e2: 0x0092, # HEBREW LETTER AYIN + 0x05e3: 0x0093, # HEBREW LETTER FINAL PE + 0x05e4: 0x0094, # HEBREW LETTER PE + 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI + 0x05e6: 0x0096, # HEBREW LETTER TSADI + 0x05e7: 0x0097, # HEBREW LETTER QOF + 0x05e8: 0x0098, # HEBREW LETTER RESH + 0x05e9: 0x0099, # HEBREW LETTER SHIN + 0x05ea: 0x009a, # HEBREW LETTER TAV + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp863.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp863.py new file mode 100644 index 0000000..764180b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp863.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP863.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp863', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00b6, # PILCROW SIGN + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x2017, # DOUBLE LOW LINE + 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x008f: 0x00a7, # SECTION SIGN + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00a4, # CURRENCY SIGN + 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00a6, # BROKEN BAR + 0x00a1: 0x00b4, # ACUTE ACCENT + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00a8, # DIAERESIS + 0x00a5: 0x00b8, # CEDILLA + 0x00a6: 0x00b3, # SUPERSCRIPT THREE + 0x00a7: 0x00af, # MACRON + 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xb6' # 0x0086 -> PILCROW SIGN + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u2017' # 0x008d -> DOUBLE LOW LINE + '\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa7' # 0x008f -> SECTION SIGN + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xa4' # 0x0098 -> CURRENCY SIGN + '\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xa6' # 0x00a0 -> BROKEN BAR + '\xb4' # 0x00a1 -> ACUTE ACCENT + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xa8' # 0x00a4 -> DIAERESIS + '\xb8' # 0x00a5 -> CEDILLA + '\xb3' # 0x00a6 -> SUPERSCRIPT THREE + '\xaf' # 0x00a7 -> MACRON + '\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x0098, # CURRENCY SIGN + 0x00a6: 0x00a0, # BROKEN BAR + 0x00a7: 0x008f, # SECTION SIGN + 0x00a8: 0x00a4, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00af: 0x00a7, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00a6, # SUPERSCRIPT THREE + 0x00b4: 0x00a1, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x0086, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00a5, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS + 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x2017: 0x008d, # DOUBLE LOW LINE + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp864.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp864.py new file mode 100644 index 0000000..53df482 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp864.py @@ -0,0 +1,690 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP864.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp864', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '\u066a' # 0x0025 -> ARABIC PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xb0' # 0x0080 -> DEGREE SIGN + '\xb7' # 0x0081 -> MIDDLE DOT + '\u2219' # 0x0082 -> BULLET OPERATOR + '\u221a' # 0x0083 -> SQUARE ROOT + '\u2592' # 0x0084 -> MEDIUM SHADE + '\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL + '\u2502' # 0x0086 -> FORMS LIGHT VERTICAL + '\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL + '\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT + '\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT + '\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL + '\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT + '\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT + '\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT + '\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT + '\u03b2' # 0x0090 -> GREEK SMALL BETA + '\u221e' # 0x0091 -> INFINITY + '\u03c6' # 0x0092 -> GREEK SMALL PHI + '\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN + '\xbd' # 0x0094 -> FRACTION 1/2 + '\xbc' # 0x0095 -> FRACTION 1/4 + '\u2248' # 0x0096 -> ALMOST EQUAL TO + '\xab' # 0x0097 -> LEFT POINTING GUILLEMET + '\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET + '\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x009b -> UNDEFINED + '\ufffe' # 0x009c -> UNDEFINED + '\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM + '\ufffe' # 0x009f -> UNDEFINED + '\xa0' # 0x00a0 -> NON-BREAKING SPACE + '\xad' # 0x00a1 -> SOFT HYPHEN + '\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + '\xa3' # 0x00a3 -> POUND SIGN + '\xa4' # 0x00a4 -> CURRENCY SIGN + '\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x00a6 -> UNDEFINED + '\ufffe' # 0x00a7 -> UNDEFINED + '\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM + '\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM + '\u060c' # 0x00ac -> ARABIC COMMA + '\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM + '\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM + '\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE + '\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\xa2' # 0x00c0 -> CENT SIGN + '\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM + '\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM + '\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM + '\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM + '\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM + '\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM + '\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM + '\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM + '\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM + '\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM + '\xa6' # 0x00db -> BROKEN VERTICAL BAR + '\xac' # 0x00dc -> NOT SIGN + '\xf7' # 0x00dd -> DIVISION SIGN + '\xd7' # 0x00de -> MULTIPLICATION SIGN + '\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM + '\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM + '\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM + '\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM + '\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM + '\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM + '\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM + '\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM + '\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM + '\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM + '\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM + '\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM + '\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM + '\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM + '\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM + '\u0651' # 0x00f1 -> ARABIC SHADDAH + '\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM + '\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM + '\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM + '\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM + '\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM + '\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM + '\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + '\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM + '\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM + '\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM + '\u25a0' # 0x00fe -> BLACK SQUARE + '\ufffe' # 0x00ff -> UNDEFINED +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00a0, # NON-BREAKING SPACE + 0x00a2: 0x00c0, # CENT SIGN + 0x00a3: 0x00a3, # POUND SIGN + 0x00a4: 0x00a4, # CURRENCY SIGN + 0x00a6: 0x00db, # BROKEN VERTICAL BAR + 0x00ab: 0x0097, # LEFT POINTING GUILLEMET + 0x00ac: 0x00dc, # NOT SIGN + 0x00ad: 0x00a1, # SOFT HYPHEN + 0x00b0: 0x0080, # DEGREE SIGN + 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN + 0x00b7: 0x0081, # MIDDLE DOT + 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET + 0x00bc: 0x0095, # FRACTION 1/4 + 0x00bd: 0x0094, # FRACTION 1/2 + 0x00d7: 0x00de, # MULTIPLICATION SIGN + 0x00f7: 0x00dd, # DIVISION SIGN + 0x03b2: 0x0090, # GREEK SMALL BETA + 0x03c6: 0x0092, # GREEK SMALL PHI + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0651: 0x00f1, # ARABIC SHADDAH + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE + 0x066a: 0x0025, # ARABIC PERCENT SIGN + 0x2219: 0x0082, # BULLET OPERATOR + 0x221a: 0x0083, # SQUARE ROOT + 0x221e: 0x0091, # INFINITY + 0x2248: 0x0096, # ALMOST EQUAL TO + 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL + 0x2502: 0x0086, # FORMS LIGHT VERTICAL + 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT + 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT + 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT + 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT + 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT + 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT + 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL + 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x2592: 0x0084, # MEDIUM SHADE + 0x25a0: 0x00fe, # BLACK SQUARE + 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM + 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM + 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM + 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM + 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM + 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM + 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM + 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM + 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM + 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM + 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM + 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM + 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM + 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM + 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM + 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM + 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM + 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM + 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM + 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM + 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM + 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM + 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM + 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM + 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM + 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM + 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM + 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM + 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM + 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM + 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM + 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM + 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM + 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM + 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM + 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM + 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM + 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM + 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM + 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM + 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM + 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM + 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM + 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM + 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM + 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM + 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM + 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM + 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM + 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM + 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM + 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM + 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM + 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM + 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM + 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM + 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM + 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp865.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp865.py new file mode 100644 index 0000000..6726cf3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp865.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP865.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp865', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00a4, # CURRENCY SIGN + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xa4' # 0x00af -> CURRENCY SIGN + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00af, # CURRENCY SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp866.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp866.py new file mode 100644 index 0000000..bec7ae3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp866.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP866.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp866', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI + '\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI + 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI + 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U + 0x2116: 0x00fc, # NUMERO SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp869.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp869.py new file mode 100644 index 0000000..8d8a29b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp869.py @@ -0,0 +1,689 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP869.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='cp869', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: None, # UNDEFINED + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: None, # UNDEFINED + 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0087: None, # UNDEFINED + 0x0088: 0x00b7, # MIDDLE DOT + 0x0089: 0x00ac, # NOT SIGN + 0x008a: 0x00a6, # BROKEN BAR + 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x008e: 0x2015, # HORIZONTAL BAR + 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0093: None, # UNDEFINED + 0x0094: None, # UNDEFINED + 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x0097: 0x00a9, # COPYRIGHT SIGN + 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0099: 0x00b2, # SUPERSCRIPT TWO + 0x009a: 0x00b3, # SUPERSCRIPT THREE + 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU + 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI + 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA + 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00e6: 0x03bc, # GREEK SMALL LETTER MU + 0x00e7: 0x03bd, # GREEK SMALL LETTER NU + 0x00e8: 0x03be, # GREEK SMALL LETTER XI + 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ea: 0x03c0, # GREEK SMALL LETTER PI + 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO + 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ef: 0x0384, # GREEK TONOS + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\ufffe' # 0x0080 -> UNDEFINED + '\ufffe' # 0x0081 -> UNDEFINED + '\ufffe' # 0x0082 -> UNDEFINED + '\ufffe' # 0x0083 -> UNDEFINED + '\ufffe' # 0x0084 -> UNDEFINED + '\ufffe' # 0x0085 -> UNDEFINED + '\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\ufffe' # 0x0087 -> UNDEFINED + '\xb7' # 0x0088 -> MIDDLE DOT + '\xac' # 0x0089 -> NOT SIGN + '\xa6' # 0x008a -> BROKEN BAR + '\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK + '\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u2015' # 0x008e -> HORIZONTAL BAR + '\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\ufffe' # 0x0093 -> UNDEFINED + '\ufffe' # 0x0094 -> UNDEFINED + '\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xa9' # 0x0097 -> COPYRIGHT SIGN + '\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb2' # 0x0099 -> SUPERSCRIPT TWO + '\xb3' # 0x009a -> SUPERSCRIPT THREE + '\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS + '\xa3' # 0x009c -> POUND SIGN + '\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI + '\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA + '\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU + '\u03be' # 0x00e8 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00ea -> GREEK SMALL LETTER PI + '\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU + '\u0384' # 0x00ef -> GREEK TONOS + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI + '\xa7' # 0x00f5 -> SECTION SIGN + '\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI + '\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA + '\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a3: 0x009c, # POUND SIGN + 0x00a6: 0x008a, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x0097, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x0089, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x0099, # SUPERSCRIPT TWO + 0x00b3: 0x009a, # SUPERSCRIPT THREE + 0x00b7: 0x0088, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x0384: 0x00ef, # GREEK TONOS + 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS + 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA + 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA + 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA + 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU + 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU + 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI + 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI + 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA + 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA + 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA + 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA + 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00e6, # GREEK SMALL LETTER MU + 0x03bd: 0x00e7, # GREEK SMALL LETTER NU + 0x03be: 0x00e8, # GREEK SMALL LETTER XI + 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00ea, # GREEK SMALL LETTER PI + 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO + 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU + 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI + 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI + 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI + 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0x008e, # HORIZONTAL BAR + 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp874.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp874.py new file mode 100644 index 0000000..59bfcbc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp874.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp874 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp874', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\ufffe' # 0x82 -> UNDEFINED + '\ufffe' # 0x83 -> UNDEFINED + '\ufffe' # 0x84 -> UNDEFINED + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\ufffe' # 0x86 -> UNDEFINED + '\ufffe' # 0x87 -> UNDEFINED + '\ufffe' # 0x88 -> UNDEFINED + '\ufffe' # 0x89 -> UNDEFINED + '\ufffe' # 0x8A -> UNDEFINED + '\ufffe' # 0x8B -> UNDEFINED + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\ufffe' # 0x99 -> UNDEFINED + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp875.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp875.py new file mode 100644 index 0000000..c25a5a4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp875.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp875 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP875.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='cp875', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x53 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x54 -> GREEK CAPITAL LETTER NU + '\u039e' # 0x55 -> GREEK CAPITAL LETTER XI + '\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '|' # 0x6A -> VERTICAL LINE + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xa8' # 0x70 -> DIAERESIS + '\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\xa0' # 0x74 -> NO-BREAK SPACE + '\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\u0385' # 0x80 -> GREEK DIALYTIKA TONOS + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x8B -> GREEK SMALL LETTER BETA + '\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\u03b7' # 0x9A -> GREEK SMALL LETTER ETA + '\u03b8' # 0x9B -> GREEK SMALL LETTER THETA + '\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x9F -> GREEK SMALL LETTER MU + '\xb4' # 0xA0 -> ACUTE ACCENT + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\u03bd' # 0xAA -> GREEK SMALL LETTER NU + '\u03be' # 0xAB -> GREEK SMALL LETTER XI + '\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xAD -> GREEK SMALL LETTER PI + '\u03c1' # 0xAE -> GREEK SMALL LETTER RHO + '\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA + '\xa3' # 0xB0 -> POUND SIGN + '\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0xBB -> GREEK SMALL LETTER TAU + '\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xBD -> GREEK SMALL LETTER PHI + '\u03c7' # 0xBE -> GREEK SMALL LETTER CHI + '\u03c8' # 0xBF -> GREEK SMALL LETTER PSI + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA + '\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK + '\u2015' # 0xCF -> HORIZONTAL BAR + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb1' # 0xDA -> PLUS-MINUS SIGN + '\xbd' # 0xDB -> VULGAR FRACTION ONE HALF + '\x1a' # 0xDC -> SUBSTITUTE + '\u0387' # 0xDD -> GREEK ANO TELEIA + '\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK + '\xa6' # 0xDF -> BROKEN BAR + '\\' # 0xE0 -> REVERSE SOLIDUS + '\x1a' # 0xE1 -> SUBSTITUTE + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xa7' # 0xEB -> SECTION SIGN + '\x1a' # 0xEC -> SUBSTITUTE + '\x1a' # 0xED -> SUBSTITUTE + '\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xEF -> NOT SIGN + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xa9' # 0xFB -> COPYRIGHT SIGN + '\x1a' # 0xFC -> SUBSTITUTE + '\x1a' # 0xFD -> SUBSTITUTE + '\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp932.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp932.py new file mode 100644 index 0000000..e01f59b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp932.py @@ -0,0 +1,39 @@ +# +# cp932.py: Python Unicode Codec for CP932 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('cp932') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp932', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp949.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp949.py new file mode 100644 index 0000000..627c871 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp949.py @@ -0,0 +1,39 @@ +# +# cp949.py: Python Unicode Codec for CP949 +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('cp949') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp949', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/cp950.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp950.py new file mode 100644 index 0000000..39eec5e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/cp950.py @@ -0,0 +1,39 @@ +# +# cp950.py: Python Unicode Codec for CP950 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('cp950') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='cp950', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jis_2004.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jis_2004.py new file mode 100644 index 0000000..72b87ae --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jis_2004.py @@ -0,0 +1,39 @@ +# +# euc_jis_2004.py: Python Unicode Codec for EUC_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jisx0213.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jisx0213.py new file mode 100644 index 0000000..cc47d04 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jisx0213.py @@ -0,0 +1,39 @@ +# +# euc_jisx0213.py: Python Unicode Codec for EUC_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jp.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jp.py new file mode 100644 index 0000000..7bcbe41 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_jp.py @@ -0,0 +1,39 @@ +# +# euc_jp.py: Python Unicode Codec for EUC_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_kr.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_kr.py new file mode 100644 index 0000000..c1fb126 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/euc_kr.py @@ -0,0 +1,39 @@ +# +# euc_kr.py: Python Unicode Codec for EUC_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('euc_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='euc_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/gb18030.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/gb18030.py new file mode 100644 index 0000000..34fb6c3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/gb18030.py @@ -0,0 +1,39 @@ +# +# gb18030.py: Python Unicode Codec for GB18030 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb18030') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb18030', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/gb2312.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/gb2312.py new file mode 100644 index 0000000..3c3b837 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/gb2312.py @@ -0,0 +1,39 @@ +# +# gb2312.py: Python Unicode Codec for GB2312 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb2312') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gb2312', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/gbk.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/gbk.py new file mode 100644 index 0000000..1b45db8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/gbk.py @@ -0,0 +1,39 @@ +# +# gbk.py: Python Unicode Codec for GBK +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gbk') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='gbk', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/hex_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/hex_codec.py new file mode 100644 index 0000000..9fb1072 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/hex_codec.py @@ -0,0 +1,55 @@ +"""Python 'hex_codec' Codec - 2-digit hex content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import binascii + +### Codec APIs + +def hex_encode(input, errors='strict'): + assert errors == 'strict' + return (binascii.b2a_hex(input), len(input)) + +def hex_decode(input, errors='strict'): + assert errors == 'strict' + return (binascii.a2b_hex(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return hex_encode(input, errors) + def decode(self, input, errors='strict'): + return hex_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return binascii.b2a_hex(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return binascii.a2b_hex(input) + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='hex', + encode=hex_encode, + decode=hex_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/hp_roman8.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/hp_roman8.py new file mode 100644 index 0000000..58de103 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/hp_roman8.py @@ -0,0 +1,314 @@ +""" Python Character Mapping Codec generated from 'hp_roman8.txt' with gencodec.py. + + Based on data from ftp://dkuug.dk/i18n/charmaps/HP-ROMAN8 (Keld Simonsen) + + Original source: LaserJet IIP Printer User's Manual HP part no + 33471-90901, Hewlet-Packard, June 1989. + + (Used with permission) + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='hp-roman8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xc0' # 0xA1 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc2' # 0xA2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc8' # 0xA3 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0xA4 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xA5 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xce' # 0xA6 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xA7 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xb4' # 0xA8 -> ACUTE ACCENT + '\u02cb' # 0xA9 -> MODIFIER LETTER GRAVE ACCENT (MANDARIN CHINESE FOURTH TONE) + '\u02c6' # 0xAA -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\xa8' # 0xAB -> DIAERESIS + '\u02dc' # 0xAC -> SMALL TILDE + '\xd9' # 0xAD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0xAE -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u20a4' # 0xAF -> LIRA SIGN + '\xaf' # 0xB0 -> MACRON + '\xdd' # 0xB1 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xB2 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb0' # 0xB3 -> DEGREE SIGN + '\xc7' # 0xB4 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xe7' # 0xB5 -> LATIN SMALL LETTER C WITH CEDILLA + '\xd1' # 0xB6 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf1' # 0xB7 -> LATIN SMALL LETTER N WITH TILDE + '\xa1' # 0xB8 -> INVERTED EXCLAMATION MARK + '\xbf' # 0xB9 -> INVERTED QUESTION MARK + '\xa4' # 0xBA -> CURRENCY SIGN + '\xa3' # 0xBB -> POUND SIGN + '\xa5' # 0xBC -> YEN SIGN + '\xa7' # 0xBD -> SECTION SIGN + '\u0192' # 0xBE -> LATIN SMALL LETTER F WITH HOOK + '\xa2' # 0xBF -> CENT SIGN + '\xe2' # 0xC0 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xea' # 0xC1 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xf4' # 0xC2 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xfb' # 0xC3 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xe1' # 0xC4 -> LATIN SMALL LETTER A WITH ACUTE + '\xe9' # 0xC5 -> LATIN SMALL LETTER E WITH ACUTE + '\xf3' # 0xC6 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0xC7 -> LATIN SMALL LETTER U WITH ACUTE + '\xe0' # 0xC8 -> LATIN SMALL LETTER A WITH GRAVE + '\xe8' # 0xC9 -> LATIN SMALL LETTER E WITH GRAVE + '\xf2' # 0xCA -> LATIN SMALL LETTER O WITH GRAVE + '\xf9' # 0xCB -> LATIN SMALL LETTER U WITH GRAVE + '\xe4' # 0xCC -> LATIN SMALL LETTER A WITH DIAERESIS + '\xeb' # 0xCD -> LATIN SMALL LETTER E WITH DIAERESIS + '\xf6' # 0xCE -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfc' # 0xCF -> LATIN SMALL LETTER U WITH DIAERESIS + '\xc5' # 0xD0 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xee' # 0xD1 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xd8' # 0xD2 -> LATIN CAPITAL LETTER O WITH STROKE + '\xc6' # 0xD3 -> LATIN CAPITAL LETTER AE + '\xe5' # 0xD4 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xed' # 0xD5 -> LATIN SMALL LETTER I WITH ACUTE + '\xf8' # 0xD6 -> LATIN SMALL LETTER O WITH STROKE + '\xe6' # 0xD7 -> LATIN SMALL LETTER AE + '\xc4' # 0xD8 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xec' # 0xD9 -> LATIN SMALL LETTER I WITH GRAVE + '\xd6' # 0xDA -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0xDB -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xc9' # 0xDC -> LATIN CAPITAL LETTER E WITH ACUTE + '\xef' # 0xDD -> LATIN SMALL LETTER I WITH DIAERESIS + '\xdf' # 0xDE -> LATIN SMALL LETTER SHARP S (GERMAN) + '\xd4' # 0xDF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xc1' # 0xE0 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0xE1 -> LATIN CAPITAL LETTER A WITH TILDE + '\xe3' # 0xE2 -> LATIN SMALL LETTER A WITH TILDE + '\xd0' # 0xE3 -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xf0' # 0xE4 -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xcd' # 0xE5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xcc' # 0xE6 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xE7 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd2' # 0xE8 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd5' # 0xE9 -> LATIN CAPITAL LETTER O WITH TILDE + '\xf5' # 0xEA -> LATIN SMALL LETTER O WITH TILDE + '\u0160' # 0xEB -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0xEC -> LATIN SMALL LETTER S WITH CARON + '\xda' # 0xED -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0178' # 0xEE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xff' # 0xEF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xde' # 0xF0 -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xfe' # 0xF1 -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb7' # 0xF2 -> MIDDLE DOT + '\xb5' # 0xF3 -> MICRO SIGN + '\xb6' # 0xF4 -> PILCROW SIGN + '\xbe' # 0xF5 -> VULGAR FRACTION THREE QUARTERS + '\u2014' # 0xF6 -> EM DASH + '\xbc' # 0xF7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xF8 -> VULGAR FRACTION ONE HALF + '\xaa' # 0xF9 -> FEMININE ORDINAL INDICATOR + '\xba' # 0xFA -> MASCULINE ORDINAL INDICATOR + '\xab' # 0xFB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u25a0' # 0xFC -> BLACK SQUARE + '\xbb' # 0xFD -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xb1' # 0xFE -> PLUS-MINUS SIGN + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/hz.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/hz.py new file mode 100644 index 0000000..383442a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/hz.py @@ -0,0 +1,39 @@ +# +# hz.py: Python Unicode Codec for HZ +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('hz') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='hz', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/idna.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/idna.py new file mode 100644 index 0000000..ea40585 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/idna.py @@ -0,0 +1,309 @@ +# This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) + +import stringprep, re, codecs +from unicodedata import ucd_3_2_0 as unicodedata + +# IDNA section 3.1 +dots = re.compile("[\u002E\u3002\uFF0E\uFF61]") + +# IDNA section 5 +ace_prefix = b"xn--" +sace_prefix = "xn--" + +# This assumes query strings, so AllowUnassigned is true +def nameprep(label): + # Map + newlabel = [] + for c in label: + if stringprep.in_table_b1(c): + # Map to nothing + continue + newlabel.append(stringprep.map_table_b2(c)) + label = "".join(newlabel) + + # Normalize + label = unicodedata.normalize("NFKC", label) + + # Prohibit + for c in label: + if stringprep.in_table_c12(c) or \ + stringprep.in_table_c22(c) or \ + stringprep.in_table_c3(c) or \ + stringprep.in_table_c4(c) or \ + stringprep.in_table_c5(c) or \ + stringprep.in_table_c6(c) or \ + stringprep.in_table_c7(c) or \ + stringprep.in_table_c8(c) or \ + stringprep.in_table_c9(c): + raise UnicodeError("Invalid character %r" % c) + + # Check bidi + RandAL = [stringprep.in_table_d1(x) for x in label] + for c in RandAL: + if c: + # There is a RandAL char in the string. Must perform further + # tests: + # 1) The characters in section 5.8 MUST be prohibited. + # This is table C.8, which was already checked + # 2) If a string contains any RandALCat character, the string + # MUST NOT contain any LCat character. + if any(stringprep.in_table_d2(x) for x in label): + raise UnicodeError("Violation of BIDI requirement 2") + + # 3) If a string contains any RandALCat character, a + # RandALCat character MUST be the first character of the + # string, and a RandALCat character MUST be the last + # character of the string. + if not RandAL[0] or not RandAL[-1]: + raise UnicodeError("Violation of BIDI requirement 3") + + return label + +def ToASCII(label): + try: + # Step 1: try ASCII + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 3: UseSTD3ASCIIRules is false, so + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 2: nameprep + label = nameprep(label) + + # Step 3: UseSTD3ASCIIRules is false + # Step 4: try ASCII + try: + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 5: Check ACE prefix + if label.startswith(sace_prefix): + raise UnicodeError("Label starts with ACE prefix") + + # Step 6: Encode with PUNYCODE + label = label.encode("punycode") + + # Step 7: Prepend ACE prefix + label = ace_prefix + label + + # Step 8: Check size + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + +def ToUnicode(label): + # Step 1: Check for ASCII + if isinstance(label, bytes): + pure_ascii = True + else: + try: + label = label.encode("ascii") + pure_ascii = True + except UnicodeError: + pure_ascii = False + if not pure_ascii: + # Step 2: Perform nameprep + label = nameprep(label) + # It doesn't say this, but apparently, it should be ASCII now + try: + label = label.encode("ascii") + except UnicodeError: + raise UnicodeError("Invalid character in IDN label") + # Step 3: Check for ACE prefix + if not label.startswith(ace_prefix): + return str(label, "ascii") + + # Step 4: Remove ACE prefix + label1 = label[len(ace_prefix):] + + # Step 5: Decode using PUNYCODE + result = label1.decode("punycode") + + # Step 6: Apply ToASCII + label2 = ToASCII(result) + + # Step 7: Compare the result of step 6 with the one of step 3 + # label2 will already be in lower case. + if str(label, "ascii").lower() != str(label2, "ascii"): + raise UnicodeError("IDNA does not round-trip", label, label2) + + # Step 8: return the result of step 5 + return result + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return b'', 0 + + try: + result = input.encode('ascii') + except UnicodeEncodeError: + pass + else: + # ASCII name: fast path + labels = result.split(b'.') + for label in labels[:-1]: + if not (0 < len(label) < 64): + raise UnicodeError("label empty or too long") + if len(labels[-1]) >= 64: + raise UnicodeError("label too long") + return result, len(input) + + result = bytearray() + labels = dots.split(input) + if labels and not labels[-1]: + trailing_dot = b'.' + del labels[-1] + else: + trailing_dot = b'' + for label in labels: + if result: + # Join with U+002E + result.extend(b'.') + result.extend(ToASCII(label)) + return bytes(result+trailing_dot), len(input) + + def decode(self, input, errors='strict'): + + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return "", 0 + + # IDNA allows decoding to operate on Unicode strings, too. + if not isinstance(input, bytes): + # XXX obviously wrong, see #3232 + input = bytes(input) + + if ace_prefix not in input: + # Fast path + try: + return input.decode('ascii'), len(input) + except UnicodeDecodeError: + pass + + labels = input.split(b".") + + if labels and len(labels[-1]) == 0: + trailing_dot = '.' + del labels[-1] + else: + trailing_dot = '' + + result = [] + for label in labels: + result.append(ToUnicode(label)) + + return ".".join(result)+trailing_dot, len(input) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, input, errors, final): + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return (b'', 0) + + labels = dots.split(input) + trailing_dot = b'' + if labels: + if not labels[-1]: + trailing_dot = b'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b'.' + + result = bytearray() + size = 0 + for label in labels: + if size: + # Join with U+002E + result.extend(b'.') + size += 1 + result.extend(ToASCII(label)) + size += len(label) + + result += trailing_dot + size += len(trailing_dot) + return (bytes(result), size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, input, errors, final): + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return ("", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(input, str): + labels = dots.split(input) + else: + # Must be ASCII string + input = str(input, "ascii") + labels = input.split(".") + + trailing_dot = '' + 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(ToUnicode(label)) + if size: + size += 1 + size += len(label) + + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp.py new file mode 100644 index 0000000..ab04060 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp.py @@ -0,0 +1,39 @@ +# +# iso2022_jp.py: Python Unicode Codec for ISO2022_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_1.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_1.py new file mode 100644 index 0000000..997044d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_1.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_1.py: Python Unicode Codec for ISO2022_JP_1 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_1') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2.py new file mode 100644 index 0000000..9106bf7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2.py: Python Unicode Codec for ISO2022_JP_2 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2004.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2004.py new file mode 100644 index 0000000..40198bf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_2004.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2004.py: Python Unicode Codec for ISO2022_JP_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_3.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_3.py new file mode 100644 index 0000000..346e08b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_3.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_3.py: Python Unicode Codec for ISO2022_JP_3 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_3') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_ext.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_ext.py new file mode 100644 index 0000000..752bab9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_jp_ext.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_ext.py: Python Unicode Codec for ISO2022_JP_EXT +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_ext') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_jp_ext', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_kr.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_kr.py new file mode 100644 index 0000000..bf70187 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso2022_kr.py @@ -0,0 +1,39 @@ +# +# iso2022_kr.py: Python Unicode Codec for ISO2022_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_kr') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='iso2022_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_1.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_1.py new file mode 100644 index 0000000..8cfc01f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_1.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_1 generated from 'MAPPINGS/ISO8859/8859-1.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_10.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_10.py new file mode 100644 index 0000000..b4fb041 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_10.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_10 generated from 'MAPPINGS/ISO8859/8859-10.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-10', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON + '\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE + '\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON + '\xad' # 0xAD -> SOFT HYPHEN + '\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON + '\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA + '\xb7' # 0xB7 -> MIDDLE DOT + '\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA + '\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE + '\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON + '\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE + '\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON + '\u2015' # 0xBD -> HORIZONTAL BAR + '\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\u0138' # 0xFF -> LATIN SMALL LETTER KRA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_11.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_11.py new file mode 100644 index 0000000..c7258ec --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_11.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_11 generated from 'MAPPINGS/ISO8859/8859-11.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-11', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_13.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_13.py new file mode 100644 index 0000000..6f8eab2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_13.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_13 generated from 'MAPPINGS/ISO8859/8859-13.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_14.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_14.py new file mode 100644 index 0000000..7568d4e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_14.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_14 generated from 'MAPPINGS/ISO8859/8859-14.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-14', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE + '\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE + '\xa3' # 0xA3 -> POUND SIGN + '\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE + '\xa7' # 0xA7 -> SECTION SIGN + '\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE + '\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE + '\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE + '\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE + '\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE + '\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE + '\xb6' # 0xB6 -> PILCROW SIGN + '\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE + '\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE + '\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE + '\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE + '\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE + '\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE + '\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS + '\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS + '\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_15.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_15.py new file mode 100644 index 0000000..43bdecd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_15.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_15 generated from 'MAPPINGS/ISO8859/8859-15.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-15', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_16.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_16.py new file mode 100644 index 0000000..e70c96e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_16.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_16 generated from 'MAPPINGS/ISO8859/8859-16.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-16', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\u20ac' # 0xA4 -> EURO SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON + '\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE + '\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK + '\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_2.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_2.py new file mode 100644 index 0000000..3698747 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_2.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_2 generated from 'MAPPINGS/ISO8859/8859-2.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON + '\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON + '\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON + '\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_3.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_3.py new file mode 100644 index 0000000..96d3063 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_3.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_3 generated from 'MAPPINGS/ISO8859/8859-3.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE + '\u02d8' # 0xA2 -> BREVE + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE + '\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE + '\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\ufffe' + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\ufffe' + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE + '\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\ufffe' + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE + '\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_4.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_4.py new file mode 100644 index 0000000..65c1e00 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_4.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_4 generated from 'MAPPINGS/ISO8859/8859-4.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-4', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0138' # 0xA2 -> LATIN SMALL LETTER KRA + '\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA + '\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE + '\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE + '\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE + '\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_5.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_5.py new file mode 100644 index 0000000..a3c868a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_5.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_5 generated from 'MAPPINGS/ISO8859/8859-5.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO + '\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE + '\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE + '\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI + '\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE + '\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE + '\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE + '\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE + '\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE + '\xad' # 0xAD -> SOFT HYPHEN + '\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U + '\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE + '\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xDE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xED -> CYRILLIC SMALL LETTER E + '\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA + '\u2116' # 0xF0 -> NUMERO SIGN + '\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO + '\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE + '\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE + '\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE + '\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI + '\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE + '\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE + '\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE + '\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE + '\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE + '\xa7' # 0xFD -> SECTION SIGN + '\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U + '\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_6.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_6.py new file mode 100644 index 0000000..b02ade6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_6.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_6 generated from 'MAPPINGS/ISO8859/8859-6.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-6', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\ufffe' + '\ufffe' + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u060c' # 0xAC -> ARABIC COMMA + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u061b' # 0xBB -> ARABIC SEMICOLON + '\ufffe' + '\ufffe' + '\ufffe' + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\ufffe' + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_7.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_7.py new file mode 100644 index 0000000..d7b39cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_7.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_7 generated from 'MAPPINGS/ISO8859/8859-7.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-7', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\u20af' # 0xA5 -> DRACHMA SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u037a' # 0xAA -> GREEK YPOGEGRAMMENI + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_8.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_8.py new file mode 100644 index 0000000..8184902 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_8.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_8 generated from 'MAPPINGS/ISO8859/8859-8.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u2017' # 0xDF -> DOUBLE LOW LINE + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' + '\ufffe' + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_9.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_9.py new file mode 100644 index 0000000..e539fdd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/iso8859_9.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_9 generated from 'MAPPINGS/ISO8859/8859-9.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-9', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/johab.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/johab.py new file mode 100644 index 0000000..512aeeb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/johab.py @@ -0,0 +1,39 @@ +# +# johab.py: Python Unicode Codec for JOHAB +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('johab') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='johab', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_r.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_r.py new file mode 100644 index 0000000..41ddde8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_r.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_r generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='koi8-r', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_t.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_t.py new file mode 100644 index 0000000..b5415ba --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_t.py @@ -0,0 +1,308 @@ +""" Python Character Mapping Codec koi8_t +""" +# http://ru.wikipedia.org/wiki/КОИ-8 +# http://www.opensource.apple.com/source/libiconv/libiconv-4/libiconv/tests/KOI8-T.TXT + +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 + +def getregentry(): + return codecs.CodecInfo( + name='koi8-t', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u049b' # 0x80 -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u0493' # 0x81 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0492' # 0x83 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u04b3' # 0x8A -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u04b2' # 0x8C -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04b7' # 0x8D -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04b6' # 0x8E -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\ufffe' # 0x8F -> UNDEFINED + '\u049a' # 0x90 -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\u04ef' # 0xA1 -> CYRILLIC SMALL LETTER U WITH MACRON + '\u04ee' # 0xA2 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e3' # 0xA5 -> CYRILLIC SMALL LETTER I WITH MACRON + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\ufffe' # 0xA8 -> UNDEFINED + '\ufffe' # 0xA9 -> UNDEFINED + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\ufffe' # 0xAF -> UNDEFINED + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\ufffe' # 0xB4 -> UNDEFINED + '\u04e2' # 0xB5 -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\ufffe' # 0xB8 -> UNDEFINED + '\u2116' # 0xB9 -> NUMERO SIGN + '\ufffe' # 0xBA -> UNDEFINED + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0xBC -> UNDEFINED + '\ufffe' # 0xBD -> UNDEFINED + '\ufffe' # 0xBE -> UNDEFINED + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_u.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_u.py new file mode 100644 index 0000000..f9e3fae --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/koi8_u.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_u generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='koi8-u', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/kz1048.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/kz1048.py new file mode 100644 index 0000000..712aee6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/kz1048.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec kz1048 generated from 'MAPPINGS/VENDORS/MISC/KZ1048.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='kz1048', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u04b0' # 0xA1 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\u04b1' # 0xA2 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u04d8' # 0xA3 -> CYRILLIC CAPITAL LETTER SCHWA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e8' # 0xA5 -> CYRILLIC CAPITAL LETTER BARRED O + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0492' # 0xAA -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u04ae' # 0xAF -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u04e9' # 0xB4 -> CYRILLIC SMALL LETTER BARRED O + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0493' # 0xBA -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u04d9' # 0xBC -> CYRILLIC SMALL LETTER SCHWA + '\u04a2' # 0xBD -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u04a3' # 0xBE -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u04af' # 0xBF -> CYRILLIC SMALL LETTER STRAIGHT U + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/latin_1.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/latin_1.py new file mode 100644 index 0000000..370160c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/latin_1.py @@ -0,0 +1,50 @@ +""" Python 'latin-1' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.latin_1_encode + decode = codecs.latin_1_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.latin_1_encode(input,self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.latin_1_decode(input,self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.latin_1_decode + decode = codecs.latin_1_encode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_arabic.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_arabic.py new file mode 100644 index 0000000..72847e8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_arabic.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/APPLE/ARABIC.TXT' with gencodec.py. + +"""#" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + return codecs.charmap_encode(input,errors,encoding_map) + + 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_map)[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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-arabic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + +### Decoding Map + +decoding_map = codecs.make_identity_dict(range(256)) +decoding_map.update({ + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00a0, # NO-BREAK SPACE, right-left + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x06ba, # ARABIC LETTER NOON GHUNNA + 0x008c: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x2026, # HORIZONTAL ELLIPSIS, right-left + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f7, # DIVISION SIGN, right-left + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x0020, # SPACE, right-left + 0x00a1: 0x0021, # EXCLAMATION MARK, right-left + 0x00a2: 0x0022, # QUOTATION MARK, right-left + 0x00a3: 0x0023, # NUMBER SIGN, right-left + 0x00a4: 0x0024, # DOLLAR SIGN, right-left + 0x00a5: 0x066a, # ARABIC PERCENT SIGN + 0x00a6: 0x0026, # AMPERSAND, right-left + 0x00a7: 0x0027, # APOSTROPHE, right-left + 0x00a8: 0x0028, # LEFT PARENTHESIS, right-left + 0x00a9: 0x0029, # RIGHT PARENTHESIS, right-left + 0x00aa: 0x002a, # ASTERISK, right-left + 0x00ab: 0x002b, # PLUS SIGN, right-left + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0x002d, # HYPHEN-MINUS, right-left + 0x00ae: 0x002e, # FULL STOP, right-left + 0x00af: 0x002f, # SOLIDUS, right-left + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x00ba: 0x003a, # COLON, right-left + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0x003c, # LESS-THAN SIGN, right-left + 0x00bd: 0x003d, # EQUALS SIGN, right-left + 0x00be: 0x003e, # GREATER-THAN SIGN, right-left + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d7: 0x0637, # ARABIC LETTER TAH + 0x00d8: 0x0638, # ARABIC LETTER ZAH + 0x00d9: 0x0639, # ARABIC LETTER AIN + 0x00da: 0x063a, # ARABIC LETTER GHAIN + 0x00db: 0x005b, # LEFT SQUARE BRACKET, right-left + 0x00dc: 0x005c, # REVERSE SOLIDUS, right-left + 0x00dd: 0x005d, # RIGHT SQUARE BRACKET, right-left + 0x00de: 0x005e, # CIRCUMFLEX ACCENT, right-left + 0x00df: 0x005f, # LOW LINE, right-left + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0x0641, # ARABIC LETTER FEH + 0x00e2: 0x0642, # ARABIC LETTER QAF + 0x00e3: 0x0643, # ARABIC LETTER KAF + 0x00e4: 0x0644, # ARABIC LETTER LAM + 0x00e5: 0x0645, # ARABIC LETTER MEEM + 0x00e6: 0x0646, # ARABIC LETTER NOON + 0x00e7: 0x0647, # ARABIC LETTER HEH + 0x00e8: 0x0648, # ARABIC LETTER WAW + 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ea: 0x064a, # ARABIC LETTER YEH + 0x00eb: 0x064b, # ARABIC FATHATAN + 0x00ec: 0x064c, # ARABIC DAMMATAN + 0x00ed: 0x064d, # ARABIC KASRATAN + 0x00ee: 0x064e, # ARABIC FATHA + 0x00ef: 0x064f, # ARABIC DAMMA + 0x00f0: 0x0650, # ARABIC KASRA + 0x00f1: 0x0651, # ARABIC SHADDA + 0x00f2: 0x0652, # ARABIC SUKUN + 0x00f3: 0x067e, # ARABIC LETTER PEH + 0x00f4: 0x0679, # ARABIC LETTER TTEH + 0x00f5: 0x0686, # ARABIC LETTER TCHEH + 0x00f6: 0x06d5, # ARABIC LETTER AE + 0x00f7: 0x06a4, # ARABIC LETTER VEH + 0x00f8: 0x06af, # ARABIC LETTER GAF + 0x00f9: 0x0688, # ARABIC LETTER DDAL + 0x00fa: 0x0691, # ARABIC LETTER RREH + 0x00fb: 0x007b, # LEFT CURLY BRACKET, right-left + 0x00fc: 0x007c, # VERTICAL LINE, right-left + 0x00fd: 0x007d, # RIGHT CURLY BRACKET, right-left + 0x00fe: 0x0698, # ARABIC LETTER JEH + 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> CONTROL CHARACTER + '\x01' # 0x0001 -> CONTROL CHARACTER + '\x02' # 0x0002 -> CONTROL CHARACTER + '\x03' # 0x0003 -> CONTROL CHARACTER + '\x04' # 0x0004 -> CONTROL CHARACTER + '\x05' # 0x0005 -> CONTROL CHARACTER + '\x06' # 0x0006 -> CONTROL CHARACTER + '\x07' # 0x0007 -> CONTROL CHARACTER + '\x08' # 0x0008 -> CONTROL CHARACTER + '\t' # 0x0009 -> CONTROL CHARACTER + '\n' # 0x000a -> CONTROL CHARACTER + '\x0b' # 0x000b -> CONTROL CHARACTER + '\x0c' # 0x000c -> CONTROL CHARACTER + '\r' # 0x000d -> CONTROL CHARACTER + '\x0e' # 0x000e -> CONTROL CHARACTER + '\x0f' # 0x000f -> CONTROL CHARACTER + '\x10' # 0x0010 -> CONTROL CHARACTER + '\x11' # 0x0011 -> CONTROL CHARACTER + '\x12' # 0x0012 -> CONTROL CHARACTER + '\x13' # 0x0013 -> CONTROL CHARACTER + '\x14' # 0x0014 -> CONTROL CHARACTER + '\x15' # 0x0015 -> CONTROL CHARACTER + '\x16' # 0x0016 -> CONTROL CHARACTER + '\x17' # 0x0017 -> CONTROL CHARACTER + '\x18' # 0x0018 -> CONTROL CHARACTER + '\x19' # 0x0019 -> CONTROL CHARACTER + '\x1a' # 0x001a -> CONTROL CHARACTER + '\x1b' # 0x001b -> CONTROL CHARACTER + '\x1c' # 0x001c -> CONTROL CHARACTER + '\x1d' # 0x001d -> CONTROL CHARACTER + '\x1e' # 0x001e -> CONTROL CHARACTER + '\x1f' # 0x001f -> CONTROL CHARACTER + ' ' # 0x0020 -> SPACE, left-right + '!' # 0x0021 -> EXCLAMATION MARK, left-right + '"' # 0x0022 -> QUOTATION MARK, left-right + '#' # 0x0023 -> NUMBER SIGN, left-right + '$' # 0x0024 -> DOLLAR SIGN, left-right + '%' # 0x0025 -> PERCENT SIGN, left-right + '&' # 0x0026 -> AMPERSAND, left-right + "'" # 0x0027 -> APOSTROPHE, left-right + '(' # 0x0028 -> LEFT PARENTHESIS, left-right + ')' # 0x0029 -> RIGHT PARENTHESIS, left-right + '*' # 0x002a -> ASTERISK, left-right + '+' # 0x002b -> PLUS SIGN, left-right + ',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x002d -> HYPHEN-MINUS, left-right + '.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x002f -> SOLIDUS, left-right + '0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + '2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + '3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + ':' # 0x003a -> COLON, left-right + ';' # 0x003b -> SEMICOLON, left-right + '<' # 0x003c -> LESS-THAN SIGN, left-right + '=' # 0x003d -> EQUALS SIGN, left-right + '>' # 0x003e -> GREATER-THAN SIGN, left-right + '?' # 0x003f -> QUESTION MARK, left-right + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET, left-right + '\\' # 0x005c -> REVERSE SOLIDUS, left-right + ']' # 0x005d -> RIGHT SQUARE BRACKET, left-right + '^' # 0x005e -> CIRCUMFLEX ACCENT, left-right + '_' # 0x005f -> LOW LINE, left-right + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET, left-right + '|' # 0x007c -> VERTICAL LINE, left-right + '}' # 0x007d -> RIGHT CURLY BRACKET, left-right + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> CONTROL CHARACTER + '\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x0081 -> NO-BREAK SPACE, right-left + '\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x009b -> DIVISION SIGN, right-left + '\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0x00a0 -> SPACE, right-left + '!' # 0x00a1 -> EXCLAMATION MARK, right-left + '"' # 0x00a2 -> QUOTATION MARK, right-left + '#' # 0x00a3 -> NUMBER SIGN, right-left + '$' # 0x00a4 -> DOLLAR SIGN, right-left + '\u066a' # 0x00a5 -> ARABIC PERCENT SIGN + '&' # 0x00a6 -> AMPERSAND, right-left + "'" # 0x00a7 -> APOSTROPHE, right-left + '(' # 0x00a8 -> LEFT PARENTHESIS, right-left + ')' # 0x00a9 -> RIGHT PARENTHESIS, right-left + '*' # 0x00aa -> ASTERISK, right-left + '+' # 0x00ab -> PLUS SIGN, right-left + '\u060c' # 0x00ac -> ARABIC COMMA + '-' # 0x00ad -> HYPHEN-MINUS, right-left + '.' # 0x00ae -> FULL STOP, right-left + '/' # 0x00af -> SOLIDUS, right-left + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0x00ba -> COLON, right-left + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '<' # 0x00bc -> LESS-THAN SIGN, right-left + '=' # 0x00bd -> EQUALS SIGN, right-left + '>' # 0x00be -> GREATER-THAN SIGN, right-left + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0x00c1 -> ARABIC LETTER HAMZA + '\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x00c7 -> ARABIC LETTER ALEF + '\u0628' # 0x00c8 -> ARABIC LETTER BEH + '\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0x00ca -> ARABIC LETTER TEH + '\u062b' # 0x00cb -> ARABIC LETTER THEH + '\u062c' # 0x00cc -> ARABIC LETTER JEEM + '\u062d' # 0x00cd -> ARABIC LETTER HAH + '\u062e' # 0x00ce -> ARABIC LETTER KHAH + '\u062f' # 0x00cf -> ARABIC LETTER DAL + '\u0630' # 0x00d0 -> ARABIC LETTER THAL + '\u0631' # 0x00d1 -> ARABIC LETTER REH + '\u0632' # 0x00d2 -> ARABIC LETTER ZAIN + '\u0633' # 0x00d3 -> ARABIC LETTER SEEN + '\u0634' # 0x00d4 -> ARABIC LETTER SHEEN + '\u0635' # 0x00d5 -> ARABIC LETTER SAD + '\u0636' # 0x00d6 -> ARABIC LETTER DAD + '\u0637' # 0x00d7 -> ARABIC LETTER TAH + '\u0638' # 0x00d8 -> ARABIC LETTER ZAH + '\u0639' # 0x00d9 -> ARABIC LETTER AIN + '\u063a' # 0x00da -> ARABIC LETTER GHAIN + '[' # 0x00db -> LEFT SQUARE BRACKET, right-left + '\\' # 0x00dc -> REVERSE SOLIDUS, right-left + ']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left + '^' # 0x00de -> CIRCUMFLEX ACCENT, right-left + '_' # 0x00df -> LOW LINE, right-left + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\u0641' # 0x00e1 -> ARABIC LETTER FEH + '\u0642' # 0x00e2 -> ARABIC LETTER QAF + '\u0643' # 0x00e3 -> ARABIC LETTER KAF + '\u0644' # 0x00e4 -> ARABIC LETTER LAM + '\u0645' # 0x00e5 -> ARABIC LETTER MEEM + '\u0646' # 0x00e6 -> ARABIC LETTER NOON + '\u0647' # 0x00e7 -> ARABIC LETTER HEH + '\u0648' # 0x00e8 -> ARABIC LETTER WAW + '\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0x00ea -> ARABIC LETTER YEH + '\u064b' # 0x00eb -> ARABIC FATHATAN + '\u064c' # 0x00ec -> ARABIC DAMMATAN + '\u064d' # 0x00ed -> ARABIC KASRATAN + '\u064e' # 0x00ee -> ARABIC FATHA + '\u064f' # 0x00ef -> ARABIC DAMMA + '\u0650' # 0x00f0 -> ARABIC KASRA + '\u0651' # 0x00f1 -> ARABIC SHADDA + '\u0652' # 0x00f2 -> ARABIC SUKUN + '\u067e' # 0x00f3 -> ARABIC LETTER PEH + '\u0679' # 0x00f4 -> ARABIC LETTER TTEH + '\u0686' # 0x00f5 -> ARABIC LETTER TCHEH + '\u06d5' # 0x00f6 -> ARABIC LETTER AE + '\u06a4' # 0x00f7 -> ARABIC LETTER VEH + '\u06af' # 0x00f8 -> ARABIC LETTER GAF + '\u0688' # 0x00f9 -> ARABIC LETTER DDAL + '\u0691' # 0x00fa -> ARABIC LETTER RREH + '{' # 0x00fb -> LEFT CURLY BRACKET, right-left + '|' # 0x00fc -> VERTICAL LINE, right-left + '}' # 0x00fd -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0x00fe -> ARABIC LETTER JEH + '\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # CONTROL CHARACTER + 0x0001: 0x0001, # CONTROL CHARACTER + 0x0002: 0x0002, # CONTROL CHARACTER + 0x0003: 0x0003, # CONTROL CHARACTER + 0x0004: 0x0004, # CONTROL CHARACTER + 0x0005: 0x0005, # CONTROL CHARACTER + 0x0006: 0x0006, # CONTROL CHARACTER + 0x0007: 0x0007, # CONTROL CHARACTER + 0x0008: 0x0008, # CONTROL CHARACTER + 0x0009: 0x0009, # CONTROL CHARACTER + 0x000a: 0x000a, # CONTROL CHARACTER + 0x000b: 0x000b, # CONTROL CHARACTER + 0x000c: 0x000c, # CONTROL CHARACTER + 0x000d: 0x000d, # CONTROL CHARACTER + 0x000e: 0x000e, # CONTROL CHARACTER + 0x000f: 0x000f, # CONTROL CHARACTER + 0x0010: 0x0010, # CONTROL CHARACTER + 0x0011: 0x0011, # CONTROL CHARACTER + 0x0012: 0x0012, # CONTROL CHARACTER + 0x0013: 0x0013, # CONTROL CHARACTER + 0x0014: 0x0014, # CONTROL CHARACTER + 0x0015: 0x0015, # CONTROL CHARACTER + 0x0016: 0x0016, # CONTROL CHARACTER + 0x0017: 0x0017, # CONTROL CHARACTER + 0x0018: 0x0018, # CONTROL CHARACTER + 0x0019: 0x0019, # CONTROL CHARACTER + 0x001a: 0x001a, # CONTROL CHARACTER + 0x001b: 0x001b, # CONTROL CHARACTER + 0x001c: 0x001c, # CONTROL CHARACTER + 0x001d: 0x001d, # CONTROL CHARACTER + 0x001e: 0x001e, # CONTROL CHARACTER + 0x001f: 0x001f, # CONTROL CHARACTER + 0x0020: 0x0020, # SPACE, left-right + 0x0020: 0x00a0, # SPACE, right-left + 0x0021: 0x0021, # EXCLAMATION MARK, left-right + 0x0021: 0x00a1, # EXCLAMATION MARK, right-left + 0x0022: 0x0022, # QUOTATION MARK, left-right + 0x0022: 0x00a2, # QUOTATION MARK, right-left + 0x0023: 0x0023, # NUMBER SIGN, left-right + 0x0023: 0x00a3, # NUMBER SIGN, right-left + 0x0024: 0x0024, # DOLLAR SIGN, left-right + 0x0024: 0x00a4, # DOLLAR SIGN, right-left + 0x0025: 0x0025, # PERCENT SIGN, left-right + 0x0026: 0x0026, # AMPERSAND, left-right + 0x0026: 0x00a6, # AMPERSAND, right-left + 0x0027: 0x0027, # APOSTROPHE, left-right + 0x0027: 0x00a7, # APOSTROPHE, right-left + 0x0028: 0x0028, # LEFT PARENTHESIS, left-right + 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left + 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right + 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left + 0x002a: 0x002a, # ASTERISK, left-right + 0x002a: 0x00aa, # ASTERISK, right-left + 0x002b: 0x002b, # PLUS SIGN, left-right + 0x002b: 0x00ab, # PLUS SIGN, right-left + 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + 0x002d: 0x002d, # HYPHEN-MINUS, left-right + 0x002d: 0x00ad, # HYPHEN-MINUS, right-left + 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + 0x002e: 0x00ae, # FULL STOP, right-left + 0x002f: 0x002f, # SOLIDUS, left-right + 0x002f: 0x00af, # SOLIDUS, right-left + 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + 0x003a: 0x003a, # COLON, left-right + 0x003a: 0x00ba, # COLON, right-left + 0x003b: 0x003b, # SEMICOLON, left-right + 0x003c: 0x003c, # LESS-THAN SIGN, left-right + 0x003c: 0x00bc, # LESS-THAN SIGN, right-left + 0x003d: 0x003d, # EQUALS SIGN, left-right + 0x003d: 0x00bd, # EQUALS SIGN, right-left + 0x003e: 0x003e, # GREATER-THAN SIGN, left-right + 0x003e: 0x00be, # GREATER-THAN SIGN, right-left + 0x003f: 0x003f, # QUESTION MARK, left-right + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right + 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left + 0x005c: 0x005c, # REVERSE SOLIDUS, left-right + 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left + 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right + 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left + 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right + 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left + 0x005f: 0x005f, # LOW LINE, left-right + 0x005f: 0x00df, # LOW LINE, right-left + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right + 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left + 0x007c: 0x007c, # VERTICAL LINE, left-right + 0x007c: 0x00fc, # VERTICAL LINE, right-left + 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right + 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # CONTROL CHARACTER + 0x00a0: 0x0081, # NO-BREAK SPACE, right-left + 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x009b, # DIVISION SIGN, right-left + 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0621: 0x00c1, # ARABIC LETTER HAMZA + 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0x00c7, # ARABIC LETTER ALEF + 0x0628: 0x00c8, # ARABIC LETTER BEH + 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA + 0x062a: 0x00ca, # ARABIC LETTER TEH + 0x062b: 0x00cb, # ARABIC LETTER THEH + 0x062c: 0x00cc, # ARABIC LETTER JEEM + 0x062d: 0x00cd, # ARABIC LETTER HAH + 0x062e: 0x00ce, # ARABIC LETTER KHAH + 0x062f: 0x00cf, # ARABIC LETTER DAL + 0x0630: 0x00d0, # ARABIC LETTER THAL + 0x0631: 0x00d1, # ARABIC LETTER REH + 0x0632: 0x00d2, # ARABIC LETTER ZAIN + 0x0633: 0x00d3, # ARABIC LETTER SEEN + 0x0634: 0x00d4, # ARABIC LETTER SHEEN + 0x0635: 0x00d5, # ARABIC LETTER SAD + 0x0636: 0x00d6, # ARABIC LETTER DAD + 0x0637: 0x00d7, # ARABIC LETTER TAH + 0x0638: 0x00d8, # ARABIC LETTER ZAH + 0x0639: 0x00d9, # ARABIC LETTER AIN + 0x063a: 0x00da, # ARABIC LETTER GHAIN + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0641: 0x00e1, # ARABIC LETTER FEH + 0x0642: 0x00e2, # ARABIC LETTER QAF + 0x0643: 0x00e3, # ARABIC LETTER KAF + 0x0644: 0x00e4, # ARABIC LETTER LAM + 0x0645: 0x00e5, # ARABIC LETTER MEEM + 0x0646: 0x00e6, # ARABIC LETTER NOON + 0x0647: 0x00e7, # ARABIC LETTER HEH + 0x0648: 0x00e8, # ARABIC LETTER WAW + 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA + 0x064a: 0x00ea, # ARABIC LETTER YEH + 0x064b: 0x00eb, # ARABIC FATHATAN + 0x064c: 0x00ec, # ARABIC DAMMATAN + 0x064d: 0x00ed, # ARABIC KASRATAN + 0x064e: 0x00ee, # ARABIC FATHA + 0x064f: 0x00ef, # ARABIC DAMMA + 0x0650: 0x00f0, # ARABIC KASRA + 0x0651: 0x00f1, # ARABIC SHADDA + 0x0652: 0x00f2, # ARABIC SUKUN + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x066a: 0x00a5, # ARABIC PERCENT SIGN + 0x0679: 0x00f4, # ARABIC LETTER TTEH + 0x067e: 0x00f3, # ARABIC LETTER PEH + 0x0686: 0x00f5, # ARABIC LETTER TCHEH + 0x0688: 0x00f9, # ARABIC LETTER DDAL + 0x0691: 0x00fa, # ARABIC LETTER RREH + 0x0698: 0x00fe, # ARABIC LETTER JEH + 0x06a4: 0x00f7, # ARABIC LETTER VEH + 0x06af: 0x00f8, # ARABIC LETTER GAF + 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA + 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE + 0x06d5: 0x00f6, # ARABIC LETTER AE + 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left + 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_centeuro.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_centeuro.py new file mode 100644 index 0000000..5785a0e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_centeuro.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-centeuro', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_croatian.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_croatian.py new file mode 100644 index 0000000..4a92fe6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_croatian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_croatian generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-croatian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u2206' # 0xB4 -> INCREMENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\uf8ff' # 0xD8 -> Apple logo + '\xa9' # 0xD9 -> COPYRIGHT SIGN + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\xc6' # 0xDE -> LATIN CAPITAL LETTER AE + '\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2013' # 0xE0 -> EN DASH + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u03c0' # 0xF9 -> GREEK SMALL LETTER PI + '\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe6' # 0xFE -> LATIN SMALL LETTER AE + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_cyrillic.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_cyrillic.py new file mode 100644 index 0000000..d20272a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_cyrillic.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_cyrillic generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-cyrillic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE + '\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE + '\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\xb5' # 0xB5 -> MICRO SIGN + '\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE + '\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI + '\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE + '\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE + '\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE + '\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE + '\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE + '\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE + '\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE + '\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE + '\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK + '\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U + '\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE + '\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE + '\u2116' # 0xDC -> NUMERO SIGN + '\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO + '\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u20ac' # 0xFF -> EURO SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_farsi.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_farsi.py new file mode 100644 index 0000000..e357d43 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_farsi.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_farsi generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-farsi', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE, left-right + '!' # 0x21 -> EXCLAMATION MARK, left-right + '"' # 0x22 -> QUOTATION MARK, left-right + '#' # 0x23 -> NUMBER SIGN, left-right + '$' # 0x24 -> DOLLAR SIGN, left-right + '%' # 0x25 -> PERCENT SIGN, left-right + '&' # 0x26 -> AMPERSAND, left-right + "'" # 0x27 -> APOSTROPHE, left-right + '(' # 0x28 -> LEFT PARENTHESIS, left-right + ')' # 0x29 -> RIGHT PARENTHESIS, left-right + '*' # 0x2A -> ASTERISK, left-right + '+' # 0x2B -> PLUS SIGN, left-right + ',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x2D -> HYPHEN-MINUS, left-right + '.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x2F -> SOLIDUS, left-right + '0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + '1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + '2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + '3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + '4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + '6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + ':' # 0x3A -> COLON, left-right + ';' # 0x3B -> SEMICOLON, left-right + '<' # 0x3C -> LESS-THAN SIGN, left-right + '=' # 0x3D -> EQUALS SIGN, left-right + '>' # 0x3E -> GREATER-THAN SIGN, left-right + '?' # 0x3F -> QUESTION MARK, left-right + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET, left-right + '\\' # 0x5C -> REVERSE SOLIDUS, left-right + ']' # 0x5D -> RIGHT SQUARE BRACKET, left-right + '^' # 0x5E -> CIRCUMFLEX ACCENT, left-right + '_' # 0x5F -> LOW LINE, left-right + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET, left-right + '|' # 0x7C -> VERTICAL LINE, left-right + '}' # 0x7D -> RIGHT CURLY BRACKET, left-right + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x81 -> NO-BREAK SPACE, right-left + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x9B -> DIVISION SIGN, right-left + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0xA0 -> SPACE, right-left + '!' # 0xA1 -> EXCLAMATION MARK, right-left + '"' # 0xA2 -> QUOTATION MARK, right-left + '#' # 0xA3 -> NUMBER SIGN, right-left + '$' # 0xA4 -> DOLLAR SIGN, right-left + '\u066a' # 0xA5 -> ARABIC PERCENT SIGN + '&' # 0xA6 -> AMPERSAND, right-left + "'" # 0xA7 -> APOSTROPHE, right-left + '(' # 0xA8 -> LEFT PARENTHESIS, right-left + ')' # 0xA9 -> RIGHT PARENTHESIS, right-left + '*' # 0xAA -> ASTERISK, right-left + '+' # 0xAB -> PLUS SIGN, right-left + '\u060c' # 0xAC -> ARABIC COMMA + '-' # 0xAD -> HYPHEN-MINUS, right-left + '.' # 0xAE -> FULL STOP, right-left + '/' # 0xAF -> SOLIDUS, right-left + '\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0xBA -> COLON, right-left + '\u061b' # 0xBB -> ARABIC SEMICOLON + '<' # 0xBC -> LESS-THAN SIGN, right-left + '=' # 0xBD -> EQUALS SIGN, right-left + '>' # 0xBE -> GREATER-THAN SIGN, right-left + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '[' # 0xDB -> LEFT SQUARE BRACKET, right-left + '\\' # 0xDC -> REVERSE SOLIDUS, right-left + ']' # 0xDD -> RIGHT SQUARE BRACKET, right-left + '^' # 0xDE -> CIRCUMFLEX ACCENT, right-left + '_' # 0xDF -> LOW LINE, right-left + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\u067e' # 0xF3 -> ARABIC LETTER PEH + '\u0679' # 0xF4 -> ARABIC LETTER TTEH + '\u0686' # 0xF5 -> ARABIC LETTER TCHEH + '\u06d5' # 0xF6 -> ARABIC LETTER AE + '\u06a4' # 0xF7 -> ARABIC LETTER VEH + '\u06af' # 0xF8 -> ARABIC LETTER GAF + '\u0688' # 0xF9 -> ARABIC LETTER DDAL + '\u0691' # 0xFA -> ARABIC LETTER RREH + '{' # 0xFB -> LEFT CURLY BRACKET, right-left + '|' # 0xFC -> VERTICAL LINE, right-left + '}' # 0xFD -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0xFE -> ARABIC LETTER JEH + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_greek.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_greek.py new file mode 100644 index 0000000..d3d0c4f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_greek.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_greek generated from 'MAPPINGS/VENDORS/APPLE/GREEK.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-greek', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xb9' # 0x81 -> SUPERSCRIPT ONE + '\xb2' # 0x82 -> SUPERSCRIPT TWO + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xb3' # 0x84 -> SUPERSCRIPT THREE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0385' # 0x87 -> GREEK DIALYTIKA TONOS + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0384' # 0x8B -> GREEK TONOS + '\xa8' # 0x8C -> DIAERESIS + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xa3' # 0x92 -> POUND SIGN + '\u2122' # 0x93 -> TRADE MARK SIGN + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\u2022' # 0x96 -> BULLET + '\xbd' # 0x97 -> VULGAR FRACTION ONE HALF + '\u2030' # 0x98 -> PER MILLE SIGN + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xa6' # 0x9B -> BROKEN BAR + '\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA + '\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA + '\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA + '\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI + '\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA + '\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\xa7' # 0xAC -> SECTION SIGN + '\u2260' # 0xAD -> NOT EQUAL TO + '\xb0' # 0xAE -> DEGREE SIGN + '\xb7' # 0xAF -> MIDDLE DOT + '\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA + '\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA + '\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA + '\u039c' # 0xBB -> GREEK CAPITAL LETTER MU + '\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI + '\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA + '\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU + '\xac' # 0xC2 -> NOT SIGN + '\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON + '\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON + '\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI + '\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2015' # 0xD1 -> HORIZONTAL BAR + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI + '\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA + '\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03be' # 0xEA -> GREEK SMALL LETTER XI + '\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xED -> GREEK SMALL LETTER MU + '\u03bd' # 0xEE -> GREEK SMALL LETTER NU + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA + '\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA + '\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI + '\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON + '\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA + '\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_iceland.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_iceland.py new file mode 100644 index 0000000..add10f4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_iceland.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_iceland generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-iceland', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH + '\xf0' # 0xDD -> LATIN SMALL LETTER ETH + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xfe' # 0xDF -> LATIN SMALL LETTER THORN + '\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_latin2.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_latin2.py new file mode 100644 index 0000000..da9d4b1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_latin2.py @@ -0,0 +1,312 @@ +""" Python Character Mapping Codec mac_latin2 generated from 'MAPPINGS/VENDORS/MICSFT/MAC/LATIN2.TXT' with gencodec.py. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-latin2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_roman.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_roman.py new file mode 100644 index 0000000..b74b002 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_roman.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_roman generated from 'MAPPINGS/VENDORS/APPLE/ROMAN.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-roman', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI + '\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_romanian.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_romanian.py new file mode 100644 index 0000000..d141b4c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_romanian.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_romanian generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-romanian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE + '\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE + '\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_turkish.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_turkish.py new file mode 100644 index 0000000..044d4cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mac_turkish.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_turkish generated from 'MAPPINGS/VENDORS/APPLE/TURKISH.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='mac-turkish', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE + '\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\uf8a0' # 0xF5 -> undefined1 + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/mbcs.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/mbcs.py new file mode 100644 index 0000000..baf46cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/mbcs.py @@ -0,0 +1,47 @@ +""" Python 'mbcs' Codec for Windows + + +Cloned by Mark Hammond (mhammond@skippinet.com.au) from ascii.py, +which was written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import mbcs_encode, mbcs_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = mbcs_encode + +def decode(input, errors='strict'): + return mbcs_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return mbcs_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = mbcs_decode + +class StreamWriter(codecs.StreamWriter): + encode = mbcs_encode + +class StreamReader(codecs.StreamReader): + decode = mbcs_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mbcs', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/oem.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/oem.py new file mode 100644 index 0000000..2c3426b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/oem.py @@ -0,0 +1,41 @@ +""" Python 'oem' Codec for Windows + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import oem_encode, oem_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = oem_encode + +def decode(input, errors='strict'): + return oem_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return oem_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = oem_decode + +class StreamWriter(codecs.StreamWriter): + encode = oem_encode + +class StreamReader(codecs.StreamReader): + decode = oem_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='oem', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/palmos.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/palmos.py new file mode 100644 index 0000000..c506d65 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/palmos.py @@ -0,0 +1,308 @@ +""" Python Character Mapping Codec for PalmOS 3.5. + +Written by Sjoerd Mullender (sjoerd@acm.org); based on iso8859_15.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='palmos', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\x81' # 0x81 -> + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u2666' # 0x8D -> BLACK DIAMOND SUIT + '\u2663' # 0x8E -> BLACK CLUB SUIT + '\u2665' # 0x8F -> BLACK HEART SUIT + '\u2660' # 0x90 -> BLACK SPADE SUIT + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\x9b' # 0x9B -> + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/ptcp154.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/ptcp154.py new file mode 100644 index 0000000..656b79d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/ptcp154.py @@ -0,0 +1,312 @@ +""" Python Character Mapping Codec generated from 'PTCP154.txt' with gencodec.py. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. +(c) Copyright 2000 Guido van Rossum. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='ptcp154', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE (DEL) + '\u0496' # 0x80 -> CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + '\u0492' # 0x81 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u04ee' # 0x82 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0493' # 0x83 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u04b6' # 0x86 -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\u04ae' # 0x87 -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\u04b2' # 0x88 -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04af' # 0x89 -> CYRILLIC SMALL LETTER STRAIGHT U + '\u04a0' # 0x8A -> CYRILLIC CAPITAL LETTER BASHKIR KA + '\u04e2' # 0x8B -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\u04a2' # 0x8C -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u04b8' # 0x8F -> CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + '\u0497' # 0x90 -> CYRILLIC SMALL LETTER ZHE WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u04b3' # 0x98 -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u04b7' # 0x99 -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04a1' # 0x9A -> CYRILLIC SMALL LETTER BASHKIR KA + '\u04e3' # 0x9B -> CYRILLIC SMALL LETTER I WITH MACRON + '\u04a3' # 0x9C -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u04b9' # 0x9F -> CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U (Byelorussian) + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\u04e8' # 0xA4 -> CYRILLIC CAPITAL LETTER BARRED O + '\u0498' # 0xA5 -> CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + '\u04b0' # 0xA6 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u04d8' # 0xAA -> CYRILLIC CAPITAL LETTER SCHWA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\u04ef' # 0xAD -> CYRILLIC SMALL LETTER U WITH MACRON + '\xae' # 0xAE -> REGISTERED SIGN + '\u049c' # 0xAF -> CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u04b1' # 0xB1 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0499' # 0xB4 -> CYRILLIC SMALL LETTER ZE WITH DESCENDER + '\u04e9' # 0xB5 -> CYRILLIC SMALL LETTER BARRED O + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u04d9' # 0xBA -> CYRILLIC SMALL LETTER SCHWA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u04aa' # 0xBD -> CYRILLIC CAPITAL LETTER ES WITH DESCENDER + '\u04ab' # 0xBE -> CYRILLIC SMALL LETTER ES WITH DESCENDER + '\u049d' # 0xBF -> CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/punycode.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/punycode.py new file mode 100644 index 0000000..66c5101 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/punycode.py @@ -0,0 +1,237 @@ +""" Codec for the Punicode encoding, as specified in RFC 3492 + +Written by Martin v. Löwis. +""" + +import codecs + +##################### Encoding ##################################### + +def segregate(str): + """3.1 Basic code point segregation""" + base = bytearray() + extended = set() + for c in str: + if ord(c) < 128: + base.append(ord(c)) + else: + extended.add(c) + extended = sorted(extended) + return bytes(base), extended + +def selective_len(str, max): + """Return the length of str, considering only characters below max.""" + res = 0 + for c in str: + if ord(c) < max: + res += 1 + return res + +def selective_find(str, char, index, pos): + """Return a pair (index, pos), indicating the next occurrence of + char in str. index is the position of the character considering + only ordinals up to and including char, and pos is the position in + the full string. index/pos is the starting position in the full + string.""" + + l = len(str) + while 1: + pos += 1 + if pos == l: + return (-1, -1) + c = str[pos] + if c == char: + return index+1, pos + elif c < char: + index += 1 + +def insertion_unsort(str, extended): + """3.2 Insertion unsort coding""" + oldchar = 0x80 + result = [] + oldindex = -1 + for c in extended: + index = pos = -1 + char = ord(c) + curlen = selective_len(str, char) + delta = (curlen+1) * (char - oldchar) + while 1: + index,pos = selective_find(str,c,index,pos) + if index == -1: + break + delta += index - oldindex + result.append(delta-1) + oldindex = index + delta = 0 + oldchar = char + + return result + +def T(j, bias): + # Punycode parameters: tmin = 1, tmax = 26, base = 36 + res = 36 * (j + 1) - bias + if res < 1: return 1 + if res > 26: return 26 + return res + +digits = b"abcdefghijklmnopqrstuvwxyz0123456789" +def generate_generalized_integer(N, bias): + """3.3 Generalized variable-length integers""" + result = bytearray() + j = 0 + while 1: + t = T(j, bias) + if N < t: + result.append(digits[N]) + return bytes(result) + result.append(digits[t + ((N - t) % (36 - t))]) + N = (N - t) // (36 - t) + j += 1 + +def adapt(delta, first, numchars): + if first: + delta //= 700 + else: + delta //= 2 + delta += delta // numchars + # ((base - tmin) * tmax) // 2 == 455 + divisions = 0 + while delta > 455: + delta = delta // 35 # base - tmin + divisions += 36 + bias = divisions + (36 * delta // (delta + 38)) + return bias + + +def generate_integers(baselen, deltas): + """3.4 Bias adaptation""" + # Punycode parameters: initial bias = 72, damp = 700, skew = 38 + result = bytearray() + bias = 72 + for points, delta in enumerate(deltas): + s = generate_generalized_integer(delta, bias) + result.extend(s) + bias = adapt(delta, points==0, baselen+points+1) + return bytes(result) + +def punycode_encode(text): + base, extended = segregate(text) + deltas = insertion_unsort(text, extended) + extended = generate_integers(len(base), deltas) + if base: + return base + b"-" + extended + return extended + +##################### Decoding ##################################### + +def decode_generalized_number(extended, extpos, bias, errors): + """3.3 Generalized variable-length integers""" + result = 0 + w = 1 + j = 0 + while 1: + try: + char = ord(extended[extpos]) + except IndexError: + if errors == "strict": + raise UnicodeError("incomplete punicode string") + return extpos + 1, None + extpos += 1 + if 0x41 <= char <= 0x5A: # A-Z + digit = char - 0x41 + elif 0x30 <= char <= 0x39: + digit = char - 22 # 0x30-26 + elif errors == "strict": + raise UnicodeError("Invalid extended code point '%s'" + % extended[extpos]) + else: + return extpos, None + t = T(j, bias) + result += digit * w + if digit < t: + return extpos, result + w = w * (36 - t) + j += 1 + + +def insertion_sort(base, extended, errors): + """3.2 Insertion unsort coding""" + char = 0x80 + pos = -1 + bias = 72 + extpos = 0 + while extpos < len(extended): + newpos, delta = decode_generalized_number(extended, extpos, + bias, errors) + if delta is None: + # There was an error in decoding. We can't continue because + # synchronization is lost. + return base + pos += delta+1 + char += pos // (len(base) + 1) + if char > 0x10FFFF: + if errors == "strict": + raise UnicodeError("Invalid character U+%x" % char) + char = ord('?') + pos = pos % (len(base) + 1) + base = base[:pos] + chr(char) + base[pos:] + bias = adapt(delta, (extpos == 0), len(base)) + extpos = newpos + return base + +def punycode_decode(text, errors): + if isinstance(text, str): + text = text.encode("ascii") + if isinstance(text, memoryview): + text = bytes(text) + pos = text.rfind(b"-") + if pos == -1: + base = "" + extended = str(text, "ascii").upper() + else: + base = str(text[:pos], "ascii", errors) + extended = str(text[pos+1:], "ascii").upper() + return insertion_sort(base, extended, errors) + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + res = punycode_encode(input) + return res, len(input) + + def decode(self, input, errors='strict'): + if errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError("Unsupported error handling "+errors) + res = punycode_decode(input, errors) + return res, len(input) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return punycode_encode(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + if self.errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError("Unsupported error handling "+self.errors) + return punycode_decode(input, self.errors) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='punycode', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/quopri_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/quopri_codec.py new file mode 100644 index 0000000..496cb76 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/quopri_codec.py @@ -0,0 +1,56 @@ +"""Codec for quoted-printable encoding. + +This codec de/encodes from bytes to bytes. +""" + +import codecs +import quopri +from io import BytesIO + +def quopri_encode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.encode(f, g, quotetabs=True) + return (g.getvalue(), len(input)) + +def quopri_decode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.decode(f, g) + return (g.getvalue(), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return quopri_encode(input, errors) + def decode(self, input, errors='strict'): + return quopri_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return quopri_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return quopri_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +# encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='quopri', + encode=quopri_encode, + decode=quopri_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/raw_unicode_escape.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/raw_unicode_escape.py new file mode 100644 index 0000000..2b919b4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/raw_unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'raw-unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.raw_unicode_escape_encode + decode = codecs.raw_unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.raw_unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.raw_unicode_escape_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='raw-unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/rot_13.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/rot_13.py new file mode 100644 index 0000000..f0b4186 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/rot_13.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +""" Python Character Mapping Codec for ROT13. + +This codec de/encodes from str to str. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return (input.translate(rot13_map), len(input)) + + def decode(self, input, errors='strict'): + return (input.translate(rot13_map), len(input)) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return input.translate(rot13_map) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return input.translate(rot13_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='rot-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) + +### Map + +rot13_map = codecs.make_identity_dict(range(256)) +rot13_map.update({ + 0x0041: 0x004e, + 0x0042: 0x004f, + 0x0043: 0x0050, + 0x0044: 0x0051, + 0x0045: 0x0052, + 0x0046: 0x0053, + 0x0047: 0x0054, + 0x0048: 0x0055, + 0x0049: 0x0056, + 0x004a: 0x0057, + 0x004b: 0x0058, + 0x004c: 0x0059, + 0x004d: 0x005a, + 0x004e: 0x0041, + 0x004f: 0x0042, + 0x0050: 0x0043, + 0x0051: 0x0044, + 0x0052: 0x0045, + 0x0053: 0x0046, + 0x0054: 0x0047, + 0x0055: 0x0048, + 0x0056: 0x0049, + 0x0057: 0x004a, + 0x0058: 0x004b, + 0x0059: 0x004c, + 0x005a: 0x004d, + 0x0061: 0x006e, + 0x0062: 0x006f, + 0x0063: 0x0070, + 0x0064: 0x0071, + 0x0065: 0x0072, + 0x0066: 0x0073, + 0x0067: 0x0074, + 0x0068: 0x0075, + 0x0069: 0x0076, + 0x006a: 0x0077, + 0x006b: 0x0078, + 0x006c: 0x0079, + 0x006d: 0x007a, + 0x006e: 0x0061, + 0x006f: 0x0062, + 0x0070: 0x0063, + 0x0071: 0x0064, + 0x0072: 0x0065, + 0x0073: 0x0066, + 0x0074: 0x0067, + 0x0075: 0x0068, + 0x0076: 0x0069, + 0x0077: 0x006a, + 0x0078: 0x006b, + 0x0079: 0x006c, + 0x007a: 0x006d, +}) + +### Filter API + +def rot13(infile, outfile): + outfile.write(codecs.encode(infile.read(), 'rot-13')) + +if __name__ == '__main__': + import sys + rot13(sys.stdin, sys.stdout) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis.py new file mode 100644 index 0000000..8338117 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis.py @@ -0,0 +1,39 @@ +# +# shift_jis.py: Python Unicode Codec for SHIFT_JIS +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis_2004.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis_2004.py new file mode 100644 index 0000000..161b1e8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jis_2004.py @@ -0,0 +1,39 @@ +# +# shift_jis_2004.py: Python Unicode Codec for SHIFT_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jis_2004') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jisx0213.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jisx0213.py new file mode 100644 index 0000000..cb653f5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/shift_jisx0213.py @@ -0,0 +1,39 @@ +# +# shift_jisx0213.py: Python Unicode Codec for SHIFT_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('shift_jisx0213') + +class Codec(codecs.Codec): + encode = codec.encode + decode = codec.decode + +class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, + codecs.IncrementalEncoder): + codec = codec + +class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, + codecs.IncrementalDecoder): + codec = codec + +class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): + codec = codec + +class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): + codec = codec + +def getregentry(): + return codecs.CodecInfo( + name='shift_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/tis_620.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/tis_620.py new file mode 100644 index 0000000..e288386 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/tis_620.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec tis_620 generated from 'python-mappings/TIS-620.TXT' with gencodec.py. + +"""#" + +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 + +def getregentry(): + return codecs.CodecInfo( + name='tis-620', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\ufffe' + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/undefined.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/undefined.py new file mode 100644 index 0000000..4690288 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/undefined.py @@ -0,0 +1,49 @@ +""" Python 'undefined' Codec + + This codec will always raise a ValueError exception when being + used. It is intended for use by the site.py file to switch off + automatic string to Unicode coercion. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + + def decode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='undefined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_escape.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_escape.py new file mode 100644 index 0000000..817f932 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'unicode-escape' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_escape_encode + decode = codecs.unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_escape_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_internal.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_internal.py new file mode 100644 index 0000000..df3e775 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/unicode_internal.py @@ -0,0 +1,45 @@ +""" Python 'unicode-internal' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + # Note: Binding these as C functions will result in the class not + # converting them to methods. This is intended. + encode = codecs.unicode_internal_encode + decode = codecs.unicode_internal_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_internal_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_internal_decode(input, self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='unicode-internal', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16.py new file mode 100644 index 0000000..c612482 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16.py @@ -0,0 +1,155 @@ +""" Python 'utf-16' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_16_encode + +def decode(input, errors='strict'): + return codecs.utf_16_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_16_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_16_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_16_be_decode + elif consumed >= 2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + + def getstate(self): + # additional state info from the base class must be None here, + # as it isn't passed along to the caller + state = codecs.BufferedIncrementalDecoder.getstate(self)[0] + # additional state info we pass to the caller: + # 0: stream is in natural order for this platform + # 1: stream is in unnatural order + # 2: endianness hasn't been determined yet + if self.decoder is None: + return (state, 2) + addstate = int((sys.byteorder == "big") != + (self.decoder is codecs.utf_16_be_decode)) + return (state, addstate) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + state = state[1] + if state == 0: + self.decoder = (codecs.utf_16_be_decode + if sys.byteorder == "big" + else codecs.utf_16_le_decode) + elif state == 1: + self.decoder = (codecs.utf_16_le_decode + if sys.byteorder == "big" + else codecs.utf_16_be_decode) + else: + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + codecs.StreamWriter.__init__(self, stream, errors) + self.encoder = None + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_16_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_16_le_decode + elif byteorder == 1: + self.decode = codecs.utf_16_be_decode + elif consumed>=2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_be.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_be.py new file mode 100644 index 0000000..86b458e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_be.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-be' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_be_encode + +def decode(input, errors='strict'): + return codecs.utf_16_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_le.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_le.py new file mode 100644 index 0000000..ec45414 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_16_le.py @@ -0,0 +1,42 @@ +""" Python 'utf-16-le' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_16_le_encode + +def decode(input, errors='strict'): + return codecs.utf_16_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_16_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_16_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-16-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32.py new file mode 100644 index 0000000..cdf84d1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32.py @@ -0,0 +1,150 @@ +""" +Python 'utf-32' Codec +""" +import codecs, sys + +### Codec APIs + +encode = codecs.utf_32_encode + +def decode(input, errors='strict'): + return codecs.utf_32_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_32_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + + def getstate(self): + # state info we return to the caller: + # 0: stream is in natural order for this platform + # 2: endianness hasn't been determined yet + # (we're never writing in unnatural order) + return (2 if self.encoder is None else 0) + + def setstate(self, state): + if state: + self.encoder = None + else: + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_32_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_32_be_decode + elif consumed >= 4: + raise UnicodeError("UTF-32 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + + def getstate(self): + # additional state info from the base class must be None here, + # as it isn't passed along to the caller + state = codecs.BufferedIncrementalDecoder.getstate(self)[0] + # additional state info we pass to the caller: + # 0: stream is in natural order for this platform + # 1: stream is in unnatural order + # 2: endianness hasn't been determined yet + if self.decoder is None: + return (state, 2) + addstate = int((sys.byteorder == "big") != + (self.decoder is codecs.utf_32_be_decode)) + return (state, addstate) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + state = state[1] + if state == 0: + self.decoder = (codecs.utf_32_be_decode + if sys.byteorder == "big" + else codecs.utf_32_le_decode) + elif state == 1: + self.decoder = (codecs.utf_32_le_decode + if sys.byteorder == "big" + else codecs.utf_32_be_decode) + else: + self.decoder = None + +class StreamWriter(codecs.StreamWriter): + def __init__(self, stream, errors='strict'): + self.encoder = None + codecs.StreamWriter.__init__(self, stream, errors) + + def reset(self): + codecs.StreamWriter.reset(self) + self.encoder = None + + def encode(self, input, errors='strict'): + if self.encoder is None: + result = codecs.utf_32_encode(input, errors) + if sys.byteorder == 'little': + self.encoder = codecs.utf_32_le_encode + else: + self.encoder = codecs.utf_32_be_encode + return result + else: + return self.encoder(input, errors) + +class StreamReader(codecs.StreamReader): + + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + (object, consumed, byteorder) = \ + codecs.utf_32_ex_decode(input, errors, 0, False) + if byteorder == -1: + self.decode = codecs.utf_32_le_decode + elif byteorder == 1: + self.decode = codecs.utf_32_be_decode + elif consumed>=4: + raise UnicodeError("UTF-32 stream does not start with BOM") + return (object, consumed) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_be.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_be.py new file mode 100644 index 0000000..fe272b5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_be.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-be' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_be_encode + +def decode(input, errors='strict'): + return codecs.utf_32_be_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_be_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_be_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_be_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_le.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_le.py new file mode 100644 index 0000000..9e48210 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_32_le.py @@ -0,0 +1,37 @@ +""" +Python 'utf-32-le' Codec +""" +import codecs + +### Codec APIs + +encode = codecs.utf_32_le_encode + +def decode(input, errors='strict'): + return codecs.utf_32_le_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_32_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_32_le_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_32_le_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_32_le_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-32-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_7.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_7.py new file mode 100644 index 0000000..8e0567f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_7.py @@ -0,0 +1,38 @@ +""" Python 'utf-7' Codec + +Written by Brian Quinlan (brian@sweetapp.com). +""" +import codecs + +### Codec APIs + +encode = codecs.utf_7_encode + +def decode(input, errors='strict'): + return codecs.utf_7_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_7_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_7_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_7_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_7_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-7', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8.py new file mode 100644 index 0000000..1bf6336 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8.py @@ -0,0 +1,42 @@ +""" Python 'utf-8' Codec + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +encode = codecs.utf_8_encode + +def decode(input, errors='strict'): + return codecs.utf_8_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_8_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_8_decode + +class StreamWriter(codecs.StreamWriter): + encode = codecs.utf_8_encode + +class StreamReader(codecs.StreamReader): + decode = codecs.utf_8_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8_sig.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8_sig.py new file mode 100644 index 0000000..1bb4792 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/utf_8_sig.py @@ -0,0 +1,130 @@ +""" Python 'utf-8-sig' Codec +This work similar to UTF-8 with the following changes: + +* On encoding/writing a UTF-8 encoded BOM will be prepended/written as the + first three bytes. + +* On decoding/reading if the first three bytes are a UTF-8 encoded BOM, these + bytes will be skipped. +""" +import codecs + +### Codec APIs + +def encode(input, errors='strict'): + return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], + len(input)) + +def decode(input, errors='strict'): + prefix = 0 + if input[:3] == codecs.BOM_UTF8: + input = input[3:] + prefix = 3 + (output, consumed) = codecs.utf_8_decode(input, errors, True) + return (output, consumed+prefix) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.first = 1 + + def encode(self, input, final=False): + if self.first: + self.first = 0 + return codecs.BOM_UTF8 + \ + codecs.utf_8_encode(input, self.errors)[0] + else: + return codecs.utf_8_encode(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.first = 1 + + def getstate(self): + return self.first + + def setstate(self, state): + self.first = state + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.first = 1 + + def _buffer_decode(self, input, errors, final): + if self.first: + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this really is a BOM + # => try again on the next call + return ("", 0) + else: + self.first = 0 + else: + self.first = 0 + if input[:3] == codecs.BOM_UTF8: + (output, consumed) = \ + codecs.utf_8_decode(input[3:], errors, final) + return (output, consumed+3) + return codecs.utf_8_decode(input, errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.first = 1 + + def getstate(self): + state = codecs.BufferedIncrementalDecoder.getstate(self) + # state[1] must be 0 here, as it isn't passed along to the caller + return (state[0], self.first) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + self.first = state[1] + +class StreamWriter(codecs.StreamWriter): + def reset(self): + codecs.StreamWriter.reset(self) + try: + del self.encode + except AttributeError: + pass + + def encode(self, input, errors='strict'): + self.encode = codecs.utf_8_encode + return encode(input, errors) + +class StreamReader(codecs.StreamReader): + def reset(self): + codecs.StreamReader.reset(self) + try: + del self.decode + except AttributeError: + pass + + def decode(self, input, errors='strict'): + if len(input) < 3: + if codecs.BOM_UTF8.startswith(input): + # not enough data to decide if this is a BOM + # => try again on the next call + return ("", 0) + elif input[:3] == codecs.BOM_UTF8: + self.decode = codecs.utf_8_decode + (output, consumed) = codecs.utf_8_decode(input[3:],errors) + return (output, consumed+3) + # (else) no BOM present + self.decode = codecs.utf_8_decode + return codecs.utf_8_decode(input, errors) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='utf-8-sig', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/uu_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/uu_codec.py new file mode 100644 index 0000000..2a5728f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/uu_codec.py @@ -0,0 +1,99 @@ +"""Python 'uu_codec' Codec - UU content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were +adapted from uu.py which was written by Lance Ellinghouse and +modified by Jack Jansen and Fredrik Lundh. +""" + +import codecs +import binascii +from io import BytesIO + +### Codec APIs + +def uu_encode(input, errors='strict', filename='', mode=0o666): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + read = infile.read + write = outfile.write + + # Encode + write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii')) + chunk = read(45) + while chunk: + write(binascii.b2a_uu(chunk)) + chunk = read(45) + write(b' \nend\n') + + return (outfile.getvalue(), len(input)) + +def uu_decode(input, errors='strict'): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + readline = infile.readline + write = outfile.write + + # Find start of encoded data + while 1: + s = readline() + if not s: + raise ValueError('Missing "begin" line in input data') + if s[:5] == b'begin': + break + + # Decode + while True: + s = readline() + if not s or s == b'end\n': + break + try: + data = binascii.a2b_uu(s) + except binascii.Error as v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((s[0]-32) & 63) * 4 + 5) // 3 + data = binascii.a2b_uu(s[:nbytes]) + #sys.stderr.write("Warning: %s\n" % str(v)) + write(data) + if not s: + raise ValueError('Truncated input data') + + return (outfile.getvalue(), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return uu_encode(input, errors) + + def decode(self, input, errors='strict'): + return uu_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return uu_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return uu_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='uu', + encode=uu_encode, + decode=uu_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/encodings/zlib_codec.py b/flaskwebproject/FlaskWebProject1/Lib/encodings/zlib_codec.py new file mode 100644 index 0000000..95908a4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/encodings/zlib_codec.py @@ -0,0 +1,77 @@ +"""Python 'zlib_codec' Codec - zlib compression encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import zlib # this codec needs the optional zlib module ! + +### Codec APIs + +def zlib_encode(input, errors='strict'): + assert errors == 'strict' + return (zlib.compress(input), len(input)) + +def zlib_decode(input, errors='strict'): + assert errors == 'strict' + return (zlib.decompress(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return zlib_encode(input, errors) + def decode(self, input, errors='strict'): + return zlib_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = zlib.compressobj() + + def encode(self, input, final=False): + if final: + c = self.compressobj.compress(input) + return c + self.compressobj.flush() + else: + return self.compressobj.compress(input) + + def reset(self): + self.compressobj = zlib.compressobj() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = zlib.decompressobj() + + def decode(self, input, final=False): + if final: + c = self.decompressobj.decompress(input) + return c + self.decompressobj.flush() + else: + return self.decompressobj.decompress(input) + + def reset(self): + self.decompressobj = zlib.decompressobj() + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='zlib', + encode=zlib_encode, + decode=zlib_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/enum.py b/flaskwebproject/FlaskWebProject1/Lib/enum.py new file mode 100644 index 0000000..112523e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/enum.py @@ -0,0 +1,875 @@ +import sys +from types import MappingProxyType, DynamicClassAttribute +from functools import reduce +from operator import or_ as _or_ + +# try _collections first to reduce startup cost +try: + from _collections import OrderedDict +except ImportError: + from collections import OrderedDict + + +__all__ = [ + 'EnumMeta', + 'Enum', 'IntEnum', 'Flag', 'IntFlag', + 'auto', 'unique', + ] + + +def _is_descriptor(obj): + """Returns True if obj is a descriptor, False otherwise.""" + return ( + hasattr(obj, '__get__') or + hasattr(obj, '__set__') or + hasattr(obj, '__delete__')) + + +def _is_dunder(name): + """Returns True if a __dunder__ name, False otherwise.""" + return (name[:2] == name[-2:] == '__' and + name[2:3] != '_' and + name[-3:-2] != '_' and + len(name) > 4) + + +def _is_sunder(name): + """Returns True if a _sunder_ name, False otherwise.""" + return (name[0] == name[-1] == '_' and + name[1:2] != '_' and + name[-2:-1] != '_' and + len(name) > 2) + +def _make_class_unpicklable(cls): + """Make the given class un-picklable.""" + def _break_on_call_reduce(self, proto): + raise TypeError('%r cannot be pickled' % self) + cls.__reduce_ex__ = _break_on_call_reduce + cls.__module__ = '' + +_auto_null = object() +class auto: + """ + Instances are replaced with an appropriate value in Enum class suites. + """ + value = _auto_null + + +class _EnumDict(dict): + """Track enum member order and ensure member names are not reused. + + EnumMeta will use the names found in self._member_names as the + enumeration member names. + + """ + def __init__(self): + super().__init__() + self._member_names = [] + self._last_values = [] + + def __setitem__(self, key, value): + """Changes anything not dundered or not a descriptor. + + If an enum member name is used twice, an error is raised; duplicate + values are not checked for. + + Single underscore (sunder) names are reserved. + + """ + if _is_sunder(key): + if key not in ( + '_order_', '_create_pseudo_member_', + '_generate_next_value_', '_missing_', + ): + raise ValueError('_names_ are reserved for future Enum use') + if key == '_generate_next_value_': + setattr(self, '_generate_next_value', value) + elif _is_dunder(key): + if key == '__order__': + key = '_order_' + elif key in self._member_names: + # descriptor overwriting an enum? + raise TypeError('Attempted to reuse key: %r' % key) + elif not _is_descriptor(value): + if key in self: + # enum overwriting a descriptor? + raise TypeError('%r already defined as: %r' % (key, self[key])) + if isinstance(value, auto): + if value.value == _auto_null: + value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + value = value.value + self._member_names.append(key) + self._last_values.append(value) + super().__setitem__(key, value) + + +# Dummy value for Enum as EnumMeta explicitly checks for it, but of course +# until EnumMeta finishes running the first time the Enum class doesn't exist. +# This is also why there are checks in EnumMeta like `if Enum is not None` +Enum = None + + +class EnumMeta(type): + """Metaclass for Enum""" + @classmethod + def __prepare__(metacls, cls, bases): + # create the namespace dict + enum_dict = _EnumDict() + # inherit previous flags and _generate_next_value_ function + member_type, first_enum = metacls._get_mixins_(bases) + if first_enum is not None: + enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) + return enum_dict + + def __new__(metacls, cls, bases, classdict): + # an Enum class is final once enumeration items have been defined; it + # cannot be mixed with other types (int, float, etc.) if it has an + # inherited __new__ unless a new __new__ is defined (or the resulting + # class will fail). + member_type, first_enum = metacls._get_mixins_(bases) + __new__, save_new, use_args = metacls._find_new_(classdict, member_type, + first_enum) + + # save enum items into separate mapping so they don't get baked into + # the new class + enum_members = {k: classdict[k] for k in classdict._member_names} + for name in classdict._member_names: + del classdict[name] + + # adjust the sunders + _order_ = classdict.pop('_order_', None) + + # check for illegal enum names (any others?) + invalid_names = set(enum_members) & {'mro', } + if invalid_names: + raise ValueError('Invalid enum member name: {0}'.format( + ','.join(invalid_names))) + + # create a default docstring if one has not been provided + if '__doc__' not in classdict: + classdict['__doc__'] = 'An enumeration.' + + # create our new Enum type + enum_class = super().__new__(metacls, cls, bases, classdict) + enum_class._member_names_ = [] # names in definition order + enum_class._member_map_ = OrderedDict() # name->value map + enum_class._member_type_ = member_type + + # save attributes from super classes so we know if we can take + # the shortcut of storing members in the class dict + base_attributes = {a for b in enum_class.mro() for a in b.__dict__} + + # Reverse value->name map for hashable values. + enum_class._value2member_map_ = {} + + # If a custom type is mixed into the Enum, and it does not know how + # to pickle itself, pickle.dumps will succeed but pickle.loads will + # fail. Rather than have the error show up later and possibly far + # from the source, sabotage the pickle protocol for this class so + # that pickle.dumps also fails. + # + # However, if the new class implements its own __reduce_ex__, do not + # sabotage -- it's on them to make sure it works correctly. We use + # __reduce_ex__ instead of any of the others as it is preferred by + # pickle over __reduce__, and it handles all pickle protocols. + if '__reduce_ex__' not in classdict: + if member_type is not object: + methods = ('__getnewargs_ex__', '__getnewargs__', + '__reduce_ex__', '__reduce__') + if not any(m in member_type.__dict__ for m in methods): + _make_class_unpicklable(enum_class) + + # instantiate them, checking for duplicates as we go + # we instantiate first instead of checking for duplicates first in case + # a custom __new__ is doing something funky with the values -- such as + # auto-numbering ;) + for member_name in classdict._member_names: + value = enum_members[member_name] + if not isinstance(value, tuple): + args = (value, ) + else: + args = value + if member_type is tuple: # special case for tuple enums + args = (args, ) # wrap it one more time + if not use_args: + enum_member = __new__(enum_class) + if not hasattr(enum_member, '_value_'): + enum_member._value_ = value + else: + enum_member = __new__(enum_class, *args) + if not hasattr(enum_member, '_value_'): + if member_type is object: + enum_member._value_ = value + else: + enum_member._value_ = member_type(*args) + value = enum_member._value_ + enum_member._name_ = member_name + enum_member.__objclass__ = enum_class + enum_member.__init__(*args) + # If another member with the same value was already defined, the + # new member becomes an alias to the existing one. + for name, canonical_member in enum_class._member_map_.items(): + if canonical_member._value_ == enum_member._value_: + enum_member = canonical_member + break + else: + # Aliases don't appear in member names (only in __members__). + enum_class._member_names_.append(member_name) + # performance boost for any member that would not shadow + # a DynamicClassAttribute + if member_name not in base_attributes: + setattr(enum_class, member_name, enum_member) + # now add to _member_map_ + enum_class._member_map_[member_name] = enum_member + try: + # This may fail if value is not hashable. We can't add the value + # to the map, and by-value lookups for this value will be + # linear. + enum_class._value2member_map_[value] = enum_member + except TypeError: + pass + + # double check that repr and friends are not the mixin's or various + # things break (such as pickle) + for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'): + class_method = getattr(enum_class, name) + obj_method = getattr(member_type, name, None) + enum_method = getattr(first_enum, name, None) + if obj_method is not None and obj_method is class_method: + setattr(enum_class, name, enum_method) + + # replace any other __new__ with our own (as long as Enum is not None, + # anyway) -- again, this is to support pickle + if Enum is not None: + # if the user defined their own __new__, save it before it gets + # clobbered in case they subclass later + if save_new: + enum_class.__new_member__ = __new__ + enum_class.__new__ = Enum.__new__ + + # py3 support for definition order (helps keep py2/py3 code in sync) + if _order_ is not None: + if isinstance(_order_, str): + _order_ = _order_.replace(',', ' ').split() + if _order_ != enum_class._member_names_: + raise TypeError('member order does not match _order_') + + return enum_class + + def __bool__(self): + """ + classes/types should always be True. + """ + return True + + def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): + """Either returns an existing member, or creates a new enum class. + + This method is used both when an enum class is given a value to match + to an enumeration member (i.e. Color(3)) and for the functional API + (i.e. Color = Enum('Color', names='RED GREEN BLUE')). + + When used for the functional API: + + `value` will be the name of the new class. + + `names` should be either a string of white-space/comma delimited names + (values will start at `start`), or an iterator/mapping of name, value pairs. + + `module` should be set to the module this class is being created in; + if it is not set, an attempt to find that module will be made, but if + it fails the class will not be picklable. + + `qualname` should be set to the actual location this class can be found + at in its module; by default it is set to the global scope. If this is + not correct, unpickling will fail in some circumstances. + + `type`, if set, will be mixed in as the first base class. + + """ + if names is None: # simple value lookup + return cls.__new__(cls, value) + # otherwise, functional API: we're creating a new Enum type + return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) + + def __contains__(cls, member): + return isinstance(member, cls) and member._name_ in cls._member_map_ + + def __delattr__(cls, attr): + # nicer error message when someone tries to delete an attribute + # (see issue19025). + if attr in cls._member_map_: + raise AttributeError( + "%s: cannot delete Enum member." % cls.__name__) + super().__delattr__(attr) + + def __dir__(self): + return (['__class__', '__doc__', '__members__', '__module__'] + + self._member_names_) + + def __getattr__(cls, name): + """Return the enum member matching `name` + + We use __getattr__ instead of descriptors or inserting into the enum + class' __dict__ in order to support `name` and `value` being both + properties for enum members (which live in the class' __dict__) and + enum members themselves. + + """ + if _is_dunder(name): + raise AttributeError(name) + try: + return cls._member_map_[name] + except KeyError: + raise AttributeError(name) from None + + def __getitem__(cls, name): + return cls._member_map_[name] + + def __iter__(cls): + return (cls._member_map_[name] for name in cls._member_names_) + + def __len__(cls): + return len(cls._member_names_) + + @property + def __members__(cls): + """Returns a mapping of member name->value. + + This mapping lists all enum members, including aliases. Note that this + is a read-only view of the internal mapping. + + """ + return MappingProxyType(cls._member_map_) + + def __repr__(cls): + return "" % cls.__name__ + + def __reversed__(cls): + return (cls._member_map_[name] for name in reversed(cls._member_names_)) + + def __setattr__(cls, name, value): + """Block attempts to reassign Enum members. + + A simple assignment to the class namespace only changes one of the + several possible ways to get an Enum member from the Enum class, + resulting in an inconsistent Enumeration. + + """ + member_map = cls.__dict__.get('_member_map_', {}) + if name in member_map: + raise AttributeError('Cannot reassign members.') + super().__setattr__(name, value) + + def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): + """Convenience method to create a new Enum class. + + `names` can be: + + * A string containing member names, separated either with spaces or + commas. Values are incremented by 1 from `start`. + * An iterable of member names. Values are incremented by 1 from `start`. + * An iterable of (member name, value) pairs. + * A mapping of member name -> value pairs. + + """ + metacls = cls.__class__ + bases = (cls, ) if type is None else (type, cls) + _, first_enum = cls._get_mixins_(bases) + classdict = metacls.__prepare__(class_name, bases) + + # special processing needed for names? + if isinstance(names, str): + names = names.replace(',', ' ').split() + if isinstance(names, (tuple, list)) and names and isinstance(names[0], str): + original_names, names = names, [] + last_values = [] + for count, name in enumerate(original_names): + value = first_enum._generate_next_value_(name, start, count, last_values[:]) + last_values.append(value) + names.append((name, value)) + + # Here, names is either an iterable of (name, value) or a mapping. + for item in names: + if isinstance(item, str): + member_name, member_value = item, names[item] + else: + member_name, member_value = item + classdict[member_name] = member_value + enum_class = metacls.__new__(metacls, class_name, bases, classdict) + + # TODO: replace the frame hack if a blessed way to know the calling + # module is ever developed + if module is None: + try: + module = sys._getframe(2).f_globals['__name__'] + except (AttributeError, ValueError) as exc: + pass + if module is None: + _make_class_unpicklable(enum_class) + else: + enum_class.__module__ = module + if qualname is not None: + enum_class.__qualname__ = qualname + + return enum_class + + @staticmethod + def _get_mixins_(bases): + """Returns the type for creating enum members, and the first inherited + enum class. + + bases: the tuple of bases that was given to __new__ + + """ + if not bases: + return object, Enum + + # double check that we are not subclassing a class with existing + # enumeration members; while we're at it, see if any other data + # type has been mixed in so we can use the correct __new__ + member_type = first_enum = None + for base in bases: + if (base is not Enum and + issubclass(base, Enum) and + base._member_names_): + raise TypeError("Cannot extend enumerations") + # base is now the last base in bases + if not issubclass(base, Enum): + raise TypeError("new enumerations must be created as " + "`ClassName([mixin_type,] enum_type)`") + + # get correct mix-in type (either mix-in type of Enum subclass, or + # first base if last base is Enum) + if not issubclass(bases[0], Enum): + member_type = bases[0] # first data type + first_enum = bases[-1] # enum type + else: + for base in bases[0].__mro__: + # most common: (IntEnum, int, Enum, object) + # possible: (, , + # , , + # ) + if issubclass(base, Enum): + if first_enum is None: + first_enum = base + else: + if member_type is None: + member_type = base + + return member_type, first_enum + + @staticmethod + def _find_new_(classdict, member_type, first_enum): + """Returns the __new__ to be used for creating the enum members. + + classdict: the class dictionary given to __new__ + member_type: the data type whose __new__ will be used by default + first_enum: enumeration to check for an overriding __new__ + + """ + # now find the correct __new__, checking to see of one was defined + # by the user; also check earlier enum classes in case a __new__ was + # saved as __new_member__ + __new__ = classdict.get('__new__', None) + + # should __new__ be saved as __new_member__ later? + save_new = __new__ is not None + + if __new__ is None: + # check all possibles for __new_member__ before falling back to + # __new__ + for method in ('__new_member__', '__new__'): + for possible in (member_type, first_enum): + target = getattr(possible, method, None) + if target not in { + None, + None.__new__, + object.__new__, + Enum.__new__, + }: + __new__ = target + break + if __new__ is not None: + break + else: + __new__ = object.__new__ + + # if a non-object.__new__ is used then whatever value/tuple was + # assigned to the enum member name will be passed to __new__ and to the + # new enum member's __init__ + if __new__ is object.__new__: + use_args = False + else: + use_args = True + + return __new__, save_new, use_args + + +class Enum(metaclass=EnumMeta): + """Generic enumeration. + + Derive from this class to define new enumerations. + + """ + def __new__(cls, value): + # all enum instances are actually created during class construction + # without calling this method; this method is called by the metaclass' + # __call__ (i.e. Color(3) ), and by pickle + if type(value) is cls: + # For lookups like Color(Color.RED) + return value + # by-value search for a matching enum member + # see if it's in the reverse mapping (for hashable values) + try: + if value in cls._value2member_map_: + return cls._value2member_map_[value] + except TypeError: + # not there, now do long search -- O(n) behavior + for member in cls._member_map_.values(): + if member._value_ == value: + return member + # still not found -- try _missing_ hook + return cls._missing_(value) + + def _generate_next_value_(name, start, count, last_values): + for last_value in reversed(last_values): + try: + return last_value + 1 + except TypeError: + pass + else: + return start + + @classmethod + def _missing_(cls, value): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + + def __repr__(self): + return "<%s.%s: %r>" % ( + self.__class__.__name__, self._name_, self._value_) + + def __str__(self): + return "%s.%s" % (self.__class__.__name__, self._name_) + + def __dir__(self): + added_behavior = [ + m + for cls in self.__class__.mro() + for m in cls.__dict__ + if m[0] != '_' and m not in self._member_map_ + ] + return (['__class__', '__doc__', '__module__'] + added_behavior) + + def __format__(self, format_spec): + # mixed-in Enums should use the mixed-in type's __format__, otherwise + # we can get strange results with the Enum name showing up instead of + # the value + + # pure Enum branch + if self._member_type_ is object: + cls = str + val = str(self) + # mix-in branch + else: + cls = self._member_type_ + val = self._value_ + return cls.__format__(val, format_spec) + + def __hash__(self): + return hash(self._name_) + + def __reduce_ex__(self, proto): + return self.__class__, (self._value_, ) + + # DynamicClassAttribute is used to provide access to the `name` and + # `value` properties of enum members while keeping some measure of + # protection from modification, while still allowing for an enumeration + # to have members named `name` and `value`. This works because enumeration + # members are not set directly on the enum class -- __getattr__ is + # used to look them up. + + @DynamicClassAttribute + def name(self): + """The name of the Enum member.""" + return self._name_ + + @DynamicClassAttribute + def value(self): + """The value of the Enum member.""" + return self._value_ + + @classmethod + def _convert(cls, name, module, filter, source=None): + """ + Create a new Enum subclass that replaces a collection of global constants + """ + # convert all constants from source (or module) that pass filter() to + # a new Enum called name, and export the enum and its members back to + # module; + # also, replace the __reduce_ex__ method so unpickling works in + # previous Python versions + module_globals = vars(sys.modules[module]) + if source: + source = vars(source) + else: + source = module_globals + # We use an OrderedDict of sorted source keys so that the + # _value2member_map is populated in the same order every time + # for a consistent reverse mapping of number to name when there + # are multiple names for the same number rather than varying + # between runs due to hash randomization of the module dictionary. + members = [ + (name, source[name]) + for name in source.keys() + if filter(name)] + try: + # sort by value + members.sort(key=lambda t: (t[1], t[0])) + except TypeError: + # unless some values aren't comparable, in which case sort by name + members.sort(key=lambda t: t[0]) + cls = cls(name, members, module=module) + cls.__reduce_ex__ = _reduce_ex_by_name + module_globals.update(cls.__members__) + module_globals[name] = cls + return cls + + +class IntEnum(int, Enum): + """Enum where members are also (and must be) ints""" + + +def _reduce_ex_by_name(self, proto): + return self.name + +class Flag(Enum): + """Support for flags""" + + def _generate_next_value_(name, start, count, last_values): + """ + Generate the next value when not given. + + name: the name of the member + start: the initital start value or None + count: the number of existing members + last_value: the last value assigned or None + """ + if not count: + return start if start is not None else 1 + for last_value in reversed(last_values): + try: + high_bit = _high_bit(last_value) + break + except Exception: + raise TypeError('Invalid Flag value: %r' % last_value) from None + return 2 ** (high_bit+1) + + @classmethod + def _missing_(cls, value): + original_value = value + if value < 0: + value = ~value + possible_member = cls._create_pseudo_member_(value) + if original_value < 0: + possible_member = ~possible_member + return possible_member + + @classmethod + def _create_pseudo_member_(cls, value): + """ + Create a composite member iff value contains only members. + """ + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + # verify all bits are accounted for + _, extra_flags = _decompose(cls, value) + if extra_flags: + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + # construct a singleton enum pseudo-member + pseudo_member = object.__new__(cls) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __contains__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return other._value_ & self._value_ == other._value_ + + def __repr__(self): + cls = self.__class__ + if self._name_ is not None: + return '<%s.%s: %r>' % (cls.__name__, self._name_, self._value_) + members, uncovered = _decompose(cls, self._value_) + return '<%s.%s: %r>' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + self._value_, + ) + + def __str__(self): + cls = self.__class__ + if self._name_ is not None: + return '%s.%s' % (cls.__name__, self._name_) + members, uncovered = _decompose(cls, self._value_) + if len(members) == 1 and members[0]._name_ is None: + return '%s.%r' % (cls.__name__, members[0]._value_) + else: + return '%s.%s' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + ) + + def __bool__(self): + return bool(self._value_) + + def __or__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ | other._value_) + + def __and__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ & other._value_) + + def __xor__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ ^ other._value_) + + def __invert__(self): + members, uncovered = _decompose(self.__class__, self._value_) + inverted_members = [ + m for m in self.__class__ + if m not in members and not m._value_ & self._value_ + ] + inverted = reduce(_or_, inverted_members, self.__class__(0)) + return self.__class__(inverted) + + +class IntFlag(int, Flag): + """Support for integer-based Flags""" + + @classmethod + def _missing_(cls, value): + if not isinstance(value, int): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + new_member = cls._create_pseudo_member_(value) + return new_member + + @classmethod + def _create_pseudo_member_(cls, value): + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + need_to_create = [value] + # get unaccounted for bits + _, extra_flags = _decompose(cls, value) + # timer = 10 + while extra_flags: + # timer -= 1 + bit = _high_bit(extra_flags) + flag_value = 2 ** bit + if (flag_value not in cls._value2member_map_ and + flag_value not in need_to_create + ): + need_to_create.append(flag_value) + if extra_flags == -flag_value: + extra_flags = 0 + else: + extra_flags ^= flag_value + for value in reversed(need_to_create): + # construct singleton pseudo-members + pseudo_member = int.__new__(cls, value) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __or__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + result = self.__class__(self._value_ | self.__class__(other)._value_) + return result + + def __and__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ & self.__class__(other)._value_) + + def __xor__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ ^ self.__class__(other)._value_) + + __ror__ = __or__ + __rand__ = __and__ + __rxor__ = __xor__ + + def __invert__(self): + result = self.__class__(~self._value_) + return result + + +def _high_bit(value): + """returns index of highest bit, or -1 if value is zero or negative""" + return value.bit_length() - 1 + +def unique(enumeration): + """Class decorator for enumerations ensuring unique member values.""" + duplicates = [] + for name, member in enumeration.__members__.items(): + if name != member.name: + duplicates.append((name, member.name)) + if duplicates: + alias_details = ', '.join( + ["%s -> %s" % (alias, name) for (alias, name) in duplicates]) + raise ValueError('duplicate values found in %r: %s' % + (enumeration, alias_details)) + return enumeration + +def _decompose(flag, value): + """Extract all members from the value.""" + # _decompose is only called if the value is not named + not_covered = value + negative = value < 0 + # issue29167: wrap accesses to _value2member_map_ in a list to avoid race + # conditions between iterating over it and having more psuedo- + # members added to it + if negative: + # only check for named flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None + ] + else: + # check for named flags and powers-of-two flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None or _power_of_two(v) + ] + members = [] + for member, member_value in flags_to_check: + if member_value and member_value & value == member_value: + members.append(member) + not_covered &= ~member_value + if not members and value in flag._value2member_map_: + members.append(flag._value2member_map_[value]) + members.sort(key=lambda m: m._value_, reverse=True) + if len(members) > 1 and members[0].value == value: + # we have the breakdown, don't need the value member itself + members.pop(0) + return members, not_covered + +def _power_of_two(value): + if value < 1: + return False + return value == 2 ** _high_bit(value) diff --git a/flaskwebproject/FlaskWebProject1/Lib/fnmatch.py b/flaskwebproject/FlaskWebProject1/Lib/fnmatch.py new file mode 100644 index 0000000..fd3b514 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/fnmatch.py @@ -0,0 +1,109 @@ +"""Filename matching with shell patterns. + +fnmatch(FILENAME, PATTERN) matches according to the local convention. +fnmatchcase(FILENAME, PATTERN) always takes case in account. + +The functions operate by translating the pattern into a regular +expression. They cache the compiled regular expressions for speed. + +The function translate(PATTERN) returns a regular expression +corresponding to PATTERN. (It does not compile it.) +""" +import os +import posixpath +import re +import functools + +__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] + +def fnmatch(name, pat): + """Test whether FILENAME matches PATTERN. + + Patterns are Unix shell style: + + * matches everything + ? matches any single character + [seq] matches any character in seq + [!seq] matches any char not in seq + + An initial period in FILENAME is not special. + Both FILENAME and PATTERN are first case-normalized + if the operating system requires it. + If you don't want this, use fnmatchcase(FILENAME, PATTERN). + """ + name = os.path.normcase(name) + pat = os.path.normcase(pat) + return fnmatchcase(name, pat) + +@functools.lru_cache(maxsize=256, typed=True) +def _compile_pattern(pat): + if isinstance(pat, bytes): + pat_str = str(pat, 'ISO-8859-1') + res_str = translate(pat_str) + res = bytes(res_str, 'ISO-8859-1') + else: + res = translate(pat) + return re.compile(res).match + +def filter(names, pat): + """Return the subset of the list NAMES that match PAT.""" + result = [] + pat = os.path.normcase(pat) + match = _compile_pattern(pat) + if os.path is posixpath: + # normcase on posix is NOP. Optimize it away from the loop. + for name in names: + if match(name): + result.append(name) + else: + for name in names: + if match(os.path.normcase(name)): + result.append(name) + return result + +def fnmatchcase(name, pat): + """Test whether FILENAME matches PATTERN, including case. + + This is a version of fnmatch() which doesn't case-normalize + its arguments. + """ + match = _compile_pattern(pat) + return match(name) is not None + + +def translate(pat): + """Translate a shell PATTERN to a regular expression. + + There is no way to quote meta-characters. + """ + + i, n = 0, len(pat) + res = '' + while i < n: + c = pat[i] + i = i+1 + if c == '*': + res = res + '.*' + elif c == '?': + res = res + '.' + elif c == '[': + j = i + if j < n and pat[j] == '!': + j = j+1 + if j < n and pat[j] == ']': + j = j+1 + while j < n and pat[j] != ']': + j = j+1 + if j >= n: + res = res + '\\[' + else: + stuff = pat[i:j].replace('\\','\\\\') + i = j+1 + if stuff[0] == '!': + stuff = '^' + stuff[1:] + elif stuff[0] == '^': + stuff = '\\' + stuff + res = '%s[%s]' % (res, stuff) + else: + res = res + re.escape(c) + return r'(?s:%s)\Z' % res diff --git a/flaskwebproject/FlaskWebProject1/Lib/functools.py b/flaskwebproject/FlaskWebProject1/Lib/functools.py new file mode 100644 index 0000000..89f2cf4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/functools.py @@ -0,0 +1,811 @@ +"""functools.py - Tools for working with functions and callable objects +""" +# Python module wrapper for _functools C module +# to allow utilities written in Python to be added +# to the functools module. +# Written by Nick Coghlan , +# Raymond Hettinger , +# and Łukasz Langa . +# Copyright (C) 2006-2013 Python Software Foundation. +# See C source code for _functools credits/copyright + +__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', + 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', + 'partialmethod', 'singledispatch'] + +try: + from _functools import reduce +except ImportError: + pass +from abc import get_cache_token +from collections import namedtuple +from types import MappingProxyType +from weakref import WeakKeyDictionary +from reprlib import recursive_repr +try: + from _thread import RLock +except ImportError: + class RLock: + 'Dummy reentrant lock for builds without threads' + def __enter__(self): pass + def __exit__(self, exctype, excinst, exctb): pass + + +################################################################################ +### update_wrapper() and wraps() decorator +################################################################################ + +# update_wrapper() and wraps() are tools to help write +# wrapper functions that can handle naive introspection + +WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__', + '__annotations__') +WRAPPER_UPDATES = ('__dict__',) +def update_wrapper(wrapper, + wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Update a wrapper function to look like the wrapped function + + wrapper is the function to be updated + wrapped is the original function + assigned is a tuple naming the attributes assigned directly + from the wrapped function to the wrapper function (defaults to + functools.WRAPPER_ASSIGNMENTS) + updated is a tuple naming the attributes of the wrapper that + are updated with the corresponding attribute from the wrapped + function (defaults to functools.WRAPPER_UPDATES) + """ + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + pass + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + # Issue #17482: set __wrapped__ last so we don't inadvertently copy it + # from the wrapped function when updating __dict__ + wrapper.__wrapped__ = wrapped + # Return the wrapper so this can be used as a decorator via partial() + return wrapper + +def wraps(wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Decorator factory to apply update_wrapper() to a wrapper function + + Returns a decorator that invokes update_wrapper() with the decorated + function as the wrapper argument and the arguments to wraps() as the + remaining arguments. Default arguments are as for update_wrapper(). + This is a convenience function to simplify applying partial() to + update_wrapper(). + """ + return partial(update_wrapper, wrapped=wrapped, + assigned=assigned, updated=updated) + + +################################################################################ +### total_ordering class decorator +################################################################################ + +# The total ordering functions all invoke the root magic method directly +# rather than using the corresponding operator. This avoids possible +# infinite recursion that could occur when the operator dispatch logic +# detects a NotImplemented result and then calls a reflected method. + +def _gt_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _le_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).' + op_result = self.__lt__(other) + return op_result or self == other + +def _ge_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a < b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _ge_from_le(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _lt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _gt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a <= b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _lt_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _ge_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).' + op_result = self.__gt__(other) + return op_result or self == other + +def _le_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a > b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _le_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a >= b) or (a == b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _gt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (a >= b) and (a != b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _lt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a >= b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +_convert = { + '__lt__': [('__gt__', _gt_from_lt), + ('__le__', _le_from_lt), + ('__ge__', _ge_from_lt)], + '__le__': [('__ge__', _ge_from_le), + ('__lt__', _lt_from_le), + ('__gt__', _gt_from_le)], + '__gt__': [('__lt__', _lt_from_gt), + ('__ge__', _ge_from_gt), + ('__le__', _le_from_gt)], + '__ge__': [('__le__', _le_from_ge), + ('__gt__', _gt_from_ge), + ('__lt__', _lt_from_ge)] +} + +def total_ordering(cls): + """Class decorator that fills in missing ordering methods""" + # Find user-defined comparisons (not those inherited from object). + roots = [op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)] + if not roots: + raise ValueError('must define at least one ordering operation: < > <= >=') + root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ + for opname, opfunc in _convert[root]: + if opname not in roots: + opfunc.__name__ = opname + setattr(cls, opname, opfunc) + return cls + + +################################################################################ +### cmp_to_key() function converter +################################################################################ + +def cmp_to_key(mycmp): + """Convert a cmp= function into a key= function""" + class K(object): + __slots__ = ['obj'] + def __init__(self, obj): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + __hash__ = None + return K + +try: + from _functools import cmp_to_key +except ImportError: + pass + + +################################################################################ +### partial() argument application +################################################################################ + +# Purely functional, no descriptor behaviour +class partial: + """New function with partial application of the given arguments + and keywords. + """ + + __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" + + def __new__(*args, **keywords): + if not args: + raise TypeError("descriptor '__new__' of partial needs an argument") + if len(args) < 2: + raise TypeError("type 'partial' takes at least one argument") + cls, func, *args = args + if not callable(func): + raise TypeError("the first argument must be callable") + args = tuple(args) + + if hasattr(func, "func"): + args = func.args + args + tmpkw = func.keywords.copy() + tmpkw.update(keywords) + keywords = tmpkw + del tmpkw + func = func.func + + self = super(partial, cls).__new__(cls) + + self.func = func + self.args = args + self.keywords = keywords + return self + + def __call__(*args, **keywords): + if not args: + raise TypeError("descriptor '__call__' of partial needs an argument") + self, *args = args + newkeywords = self.keywords.copy() + newkeywords.update(keywords) + return self.func(*self.args, *args, **newkeywords) + + @recursive_repr() + def __repr__(self): + qualname = type(self).__qualname__ + args = [repr(self.func)] + args.extend(repr(x) for x in self.args) + args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items()) + if type(self).__module__ == "functools": + return f"functools.{qualname}({', '.join(args)})" + return f"{qualname}({', '.join(args)})" + + def __reduce__(self): + return type(self), (self.func,), (self.func, self.args, + self.keywords or None, self.__dict__ or None) + + def __setstate__(self, state): + if not isinstance(state, tuple): + raise TypeError("argument to __setstate__ must be a tuple") + if len(state) != 4: + raise TypeError(f"expected 4 items in state, got {len(state)}") + func, args, kwds, namespace = state + if (not callable(func) or not isinstance(args, tuple) or + (kwds is not None and not isinstance(kwds, dict)) or + (namespace is not None and not isinstance(namespace, dict))): + raise TypeError("invalid partial state") + + args = tuple(args) # just in case it's a subclass + if kwds is None: + kwds = {} + elif type(kwds) is not dict: # XXX does it need to be *exactly* dict? + kwds = dict(kwds) + if namespace is None: + namespace = {} + + self.__dict__ = namespace + self.func = func + self.args = args + self.keywords = kwds + +try: + from _functools import partial +except ImportError: + pass + +# Descriptor version +class partialmethod(object): + """Method descriptor with partial application of the given arguments + and keywords. + + Supports wrapping existing descriptors and handles non-descriptor + callables as instance methods. + """ + + def __init__(self, func, *args, **keywords): + if not callable(func) and not hasattr(func, "__get__"): + raise TypeError("{!r} is not callable or a descriptor" + .format(func)) + + # func could be a descriptor like classmethod which isn't callable, + # so we can't inherit from partial (it verifies func is callable) + if isinstance(func, partialmethod): + # flattening is mandatory in order to place cls/self before all + # other arguments + # it's also more efficient since only one function will be called + self.func = func.func + self.args = func.args + args + self.keywords = func.keywords.copy() + self.keywords.update(keywords) + else: + self.func = func + self.args = args + self.keywords = keywords + + def __repr__(self): + args = ", ".join(map(repr, self.args)) + keywords = ", ".join("{}={!r}".format(k, v) + for k, v in self.keywords.items()) + format_string = "{module}.{cls}({func}, {args}, {keywords})" + return format_string.format(module=self.__class__.__module__, + cls=self.__class__.__qualname__, + func=self.func, + args=args, + keywords=keywords) + + def _make_unbound_method(self): + def _method(*args, **keywords): + call_keywords = self.keywords.copy() + call_keywords.update(keywords) + cls_or_self, *rest = args + call_args = (cls_or_self,) + self.args + tuple(rest) + return self.func(*call_args, **call_keywords) + _method.__isabstractmethod__ = self.__isabstractmethod__ + _method._partialmethod = self + return _method + + def __get__(self, obj, cls): + get = getattr(self.func, "__get__", None) + result = None + if get is not None: + new_func = get(obj, cls) + if new_func is not self.func: + # Assume __get__ returning something new indicates the + # creation of an appropriate callable + result = partial(new_func, *self.args, **self.keywords) + try: + result.__self__ = new_func.__self__ + except AttributeError: + pass + if result is None: + # If the underlying descriptor didn't do anything, treat this + # like an instance method + result = self._make_unbound_method().__get__(obj, cls) + return result + + @property + def __isabstractmethod__(self): + return getattr(self.func, "__isabstractmethod__", False) + + +################################################################################ +### LRU Cache function decorator +################################################################################ + +_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"]) + +class _HashedSeq(list): + """ This class guarantees that hash() will be called no more than once + per element. This is important because the lru_cache() will hash + the key multiple times on a cache miss. + + """ + + __slots__ = 'hashvalue' + + def __init__(self, tup, hash=hash): + self[:] = tup + self.hashvalue = hash(tup) + + def __hash__(self): + return self.hashvalue + +def _make_key(args, kwds, typed, + kwd_mark = (object(),), + fasttypes = {int, str, frozenset, type(None)}, + tuple=tuple, type=type, len=len): + """Make a cache key from optionally typed positional and keyword arguments + + The key is constructed in a way that is flat as possible rather than + as a nested structure that would take more memory. + + If there is only a single argument and its data type is known to cache + its hash value, then that argument is returned without a wrapper. This + saves space and improves lookup speed. + + """ + key = args + if kwds: + key += kwd_mark + for item in kwds.items(): + key += item + if typed: + key += tuple(type(v) for v in args) + if kwds: + key += tuple(type(v) for v in kwds.values()) + elif len(key) == 1 and type(key[0]) in fasttypes: + return key[0] + return _HashedSeq(key) + +def lru_cache(maxsize=128, typed=False): + """Least-recently-used cache decorator. + + If *maxsize* is set to None, the LRU features are disabled and the cache + can grow without bound. + + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + + Arguments to the cached function must be hashable. + + View the cache statistics named tuple (hits, misses, maxsize, currsize) + with f.cache_info(). Clear the cache and statistics with f.cache_clear(). + Access the underlying function with f.__wrapped__. + + See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used + + """ + + # Users should only access the lru_cache through its public API: + # cache_info, cache_clear, and f.__wrapped__ + # The internals of the lru_cache are encapsulated for thread safety and + # to allow the implementation to change (including a possible C version). + + # Early detection of an erroneous call to @lru_cache without any arguments + # resulting in the inner function being passed to maxsize instead of an + # integer or None. + if maxsize is not None and not isinstance(maxsize, int): + raise TypeError('Expected maxsize to be an integer or None') + + def decorating_function(user_function): + wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + return update_wrapper(wrapper, user_function) + + return decorating_function + +def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo): + # Constants shared by all lru cache instances: + sentinel = object() # unique object used to signal cache misses + make_key = _make_key # build a key from the function arguments + PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields + + cache = {} + hits = misses = 0 + full = False + cache_get = cache.get # bound method to lookup a key or return None + cache_len = cache.__len__ # get cache size without calling len() + lock = RLock() # because linkedlist updates aren't threadsafe + root = [] # root of the circular doubly linked list + root[:] = [root, root, None, None] # initialize by pointing to self + + if maxsize == 0: + + def wrapper(*args, **kwds): + # No caching -- just a statistics update after a successful call + nonlocal misses + result = user_function(*args, **kwds) + misses += 1 + return result + + elif maxsize is None: + + def wrapper(*args, **kwds): + # Simple caching without ordering or size limit + nonlocal hits, misses + key = make_key(args, kwds, typed) + result = cache_get(key, sentinel) + if result is not sentinel: + hits += 1 + return result + result = user_function(*args, **kwds) + cache[key] = result + misses += 1 + return result + + else: + + def wrapper(*args, **kwds): + # Size limited caching that tracks accesses by recency + nonlocal root, hits, misses, full + key = make_key(args, kwds, typed) + with lock: + link = cache_get(key) + if link is not None: + # Move the link to the front of the circular queue + link_prev, link_next, _key, result = link + link_prev[NEXT] = link_next + link_next[PREV] = link_prev + last = root[PREV] + last[NEXT] = root[PREV] = link + link[PREV] = last + link[NEXT] = root + hits += 1 + return result + result = user_function(*args, **kwds) + with lock: + if key in cache: + # Getting here means that this same key was added to the + # cache while the lock was released. Since the link + # update is already done, we need only return the + # computed result and update the count of misses. + pass + elif full: + # Use the old root to store the new key and result. + oldroot = root + oldroot[KEY] = key + oldroot[RESULT] = result + # Empty the oldest link and make it the new root. + # Keep a reference to the old key and old result to + # prevent their ref counts from going to zero during the + # update. That will prevent potentially arbitrary object + # clean-up code (i.e. __del__) from running while we're + # still adjusting the links. + root = oldroot[NEXT] + oldkey = root[KEY] + oldresult = root[RESULT] + root[KEY] = root[RESULT] = None + # Now update the cache dictionary. + del cache[oldkey] + # Save the potentially reentrant cache[key] assignment + # for last, after the root and links have been put in + # a consistent state. + cache[key] = oldroot + else: + # Put result in a new link at the front of the queue. + last = root[PREV] + link = [last, root, key, result] + last[NEXT] = root[PREV] = cache[key] = link + # Use the cache_len bound method instead of the len() function + # which could potentially be wrapped in an lru_cache itself. + full = (cache_len() >= maxsize) + misses += 1 + return result + + def cache_info(): + """Report cache statistics""" + with lock: + return _CacheInfo(hits, misses, maxsize, cache_len()) + + def cache_clear(): + """Clear the cache and cache statistics""" + nonlocal hits, misses, full + with lock: + cache.clear() + root[:] = [root, root, None, None] + hits = misses = 0 + full = False + + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return wrapper + +try: + from _functools import _lru_cache_wrapper +except ImportError: + pass + + +################################################################################ +### singledispatch() - single-dispatch generic function decorator +################################################################################ + +def _c3_merge(sequences): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if candidate is None: + raise RuntimeError("Inconsistent hierarchy") + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + +def _c3_mro(cls, abcs=None): + """Computes the method resolution order using extended C3 linearization. + + If no *abcs* are given, the algorithm works exactly like the built-in C3 + linearization used for method resolution. + + If given, *abcs* is a list of abstract base classes that should be inserted + into the resulting MRO. Unrelated ABCs are ignored and don't end up in the + result. The algorithm inserts ABCs where their functionality is introduced, + i.e. issubclass(cls, abc) returns True for the class itself but returns + False for all its direct base classes. Implicit ABCs for a given class + (either registered or inferred from the presence of a special method like + __len__) are inserted directly after the last ABC explicitly listed in the + MRO of said class. If two implicit ABCs end up next to each other in the + resulting MRO, their ordering depends on the order of types in *abcs*. + + """ + for i, base in enumerate(reversed(cls.__bases__)): + if hasattr(base, '__abstractmethods__'): + boundary = len(cls.__bases__) - i + break # Bases up to the last explicit ABC are considered first. + else: + boundary = 0 + abcs = list(abcs) if abcs else [] + explicit_bases = list(cls.__bases__[:boundary]) + abstract_bases = [] + other_bases = list(cls.__bases__[boundary:]) + for base in abcs: + if issubclass(cls, base) and not any( + issubclass(b, base) for b in cls.__bases__ + ): + # If *cls* is the class that introduces behaviour described by + # an ABC *base*, insert said ABC to its MRO. + abstract_bases.append(base) + for base in abstract_bases: + abcs.remove(base) + explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases] + abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases] + other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases] + return _c3_merge( + [[cls]] + + explicit_c3_mros + abstract_c3_mros + other_c3_mros + + [explicit_bases] + [abstract_bases] + [other_bases] + ) + +def _compose_mro(cls, types): + """Calculates the method resolution order for a given class *cls*. + + Includes relevant abstract base classes (with their respective bases) from + the *types* iterable. Uses a modified C3 linearization algorithm. + + """ + bases = set(cls.__mro__) + # Remove entries which are already present in the __mro__ or unrelated. + def is_related(typ): + return (typ not in bases and hasattr(typ, '__mro__') + and issubclass(cls, typ)) + types = [n for n in types if is_related(n)] + # Remove entries which are strict bases of other entries (they will end up + # in the MRO anyway. + def is_strict_base(typ): + for other in types: + if typ != other and typ in other.__mro__: + return True + return False + types = [n for n in types if not is_strict_base(n)] + # Subclasses of the ABCs in *types* which are also implemented by + # *cls* can be used to stabilize ABC ordering. + type_set = set(types) + mro = [] + for typ in types: + found = [] + for sub in typ.__subclasses__(): + if sub not in bases and issubclass(cls, sub): + found.append([s for s in sub.__mro__ if s in type_set]) + if not found: + mro.append(typ) + continue + # Favor subclasses with the biggest number of useful bases + found.sort(key=len, reverse=True) + for sub in found: + for subcls in sub: + if subcls not in mro: + mro.append(subcls) + return _c3_mro(cls, abcs=mro) + +def _find_impl(cls, registry): + """Returns the best matching implementation from *registry* for type *cls*. + + Where there is no registered implementation for a specific type, its method + resolution order is used to find a more generic implementation. + + Note: if *registry* does not contain an implementation for the base + *object* type, this function may return None. + + """ + mro = _compose_mro(cls, registry.keys()) + match = None + for t in mro: + if match is not None: + # If *match* is an implicit ABC but there is another unrelated, + # equally matching implicit ABC, refuse the temptation to guess. + if (t in registry and t not in cls.__mro__ + and match not in cls.__mro__ + and not issubclass(match, t)): + raise RuntimeError("Ambiguous dispatch: {} or {}".format( + match, t)) + break + if t in registry: + match = t + return registry.get(match) + +def singledispatch(func): + """Single-dispatch generic function decorator. + + Transforms a function into a generic function, which can have different + behaviours depending upon the type of its first argument. The decorated + function acts as the default implementation, and additional + implementations can be registered using the register() attribute of the + generic function. + + """ + registry = {} + dispatch_cache = WeakKeyDictionary() + cache_token = None + + def dispatch(cls): + """generic_func.dispatch(cls) -> + + Runs the dispatch algorithm to return the best available implementation + for the given *cls* registered on *generic_func*. + + """ + nonlocal cache_token + if cache_token is not None: + current_token = get_cache_token() + if cache_token != current_token: + dispatch_cache.clear() + cache_token = current_token + try: + impl = dispatch_cache[cls] + except KeyError: + try: + impl = registry[cls] + except KeyError: + impl = _find_impl(cls, registry) + dispatch_cache[cls] = impl + return impl + + def register(cls, func=None): + """generic_func.register(cls, func) -> func + + Registers a new implementation for the given *cls* on a *generic_func*. + + """ + nonlocal cache_token + if func is None: + return lambda f: register(cls, f) + registry[cls] = func + if cache_token is None and hasattr(cls, '__abstractmethods__'): + cache_token = get_cache_token() + dispatch_cache.clear() + return func + + def wrapper(*args, **kw): + return dispatch(args[0].__class__)(*args, **kw) + + registry[object] = func + wrapper.register = register + wrapper.dispatch = dispatch + wrapper.registry = MappingProxyType(registry) + wrapper._clear_cache = dispatch_cache.clear + update_wrapper(wrapper, func) + return wrapper diff --git a/flaskwebproject/FlaskWebProject1/Lib/genericpath.py b/flaskwebproject/FlaskWebProject1/Lib/genericpath.py new file mode 100644 index 0000000..303b3b3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/genericpath.py @@ -0,0 +1,151 @@ +""" +Path operations common to more than one OS +Do not use directly. The OS specific modules import the appropriate +functions from this module themselves. +""" +import os +import stat + +__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', + 'getsize', 'isdir', 'isfile', 'samefile', 'sameopenfile', + 'samestat'] + + +# Does a path exist? +# This is false for dangling symbolic links on systems that support them. +def exists(path): + """Test whether a path exists. Returns False for broken symbolic links""" + try: + os.stat(path) + except OSError: + return False + return True + + +# This follows symbolic links, so both islink() and isdir() can be true +# for the same path on systems that support symlinks +def isfile(path): + """Test whether a path is a regular file""" + try: + st = os.stat(path) + except OSError: + return False + return stat.S_ISREG(st.st_mode) + + +# Is a path a directory? +# This follows symbolic links, so both islink() and isdir() +# can be true for the same path on systems that support symlinks +def isdir(s): + """Return true if the pathname refers to an existing directory.""" + try: + st = os.stat(s) + except OSError: + return False + return stat.S_ISDIR(st.st_mode) + + +def getsize(filename): + """Return the size of a file, reported by os.stat().""" + return os.stat(filename).st_size + + +def getmtime(filename): + """Return the last modification time of a file, reported by os.stat().""" + return os.stat(filename).st_mtime + + +def getatime(filename): + """Return the last access time of a file, reported by os.stat().""" + return os.stat(filename).st_atime + + +def getctime(filename): + """Return the metadata change time of a file, reported by os.stat().""" + return os.stat(filename).st_ctime + + +# Return the longest prefix of all list elements. +def commonprefix(m): + "Given a list of pathnames, returns the longest common leading component" + if not m: return '' + # Some people pass in a list of pathname parts to operate in an OS-agnostic + # fashion; don't try to translate in that case as that's an abuse of the + # API and they are already doing what they need to be OS-agnostic and so + # they most likely won't be using an os.PathLike object in the sublists. + if not isinstance(m[0], (list, tuple)): + m = tuple(map(os.fspath, m)) + s1 = min(m) + s2 = max(m) + for i, c in enumerate(s1): + if c != s2[i]: + return s1[:i] + return s1 + +# Are two stat buffers (obtained from stat, fstat or lstat) +# describing the same file? +def samestat(s1, s2): + """Test whether two stat buffers reference the same file""" + return (s1.st_ino == s2.st_ino and + s1.st_dev == s2.st_dev) + + +# Are two filenames really pointing to the same file? +def samefile(f1, f2): + """Test whether two pathnames reference the same actual file""" + s1 = os.stat(f1) + s2 = os.stat(f2) + return samestat(s1, s2) + + +# Are two open files really referencing the same file? +# (Not necessarily the same file descriptor!) +def sameopenfile(fp1, fp2): + """Test whether two open file objects reference the same file""" + s1 = os.fstat(fp1) + s2 = os.fstat(fp2) + return samestat(s1, s2) + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +# Generic implementation of splitext, to be parametrized with +# the separators +def _splitext(p, sep, altsep, extsep): + """Split the extension from a pathname. + + Extension is everything from the last dot to the end, ignoring + leading dots. Returns "(root, ext)"; ext may be empty.""" + # NOTE: This code must work for text and bytes strings. + + sepIndex = p.rfind(sep) + if altsep: + altsepIndex = p.rfind(altsep) + sepIndex = max(sepIndex, altsepIndex) + + dotIndex = p.rfind(extsep) + if dotIndex > sepIndex: + # skip all leading dots + filenameIndex = sepIndex + 1 + while filenameIndex < dotIndex: + if p[filenameIndex:filenameIndex+1] != extsep: + return p[:dotIndex], p[dotIndex:] + filenameIndex += 1 + + return p, p[:0] + +def _check_arg_types(funcname, *args): + hasstr = hasbytes = False + for s in args: + if isinstance(s, str): + hasstr = True + elif isinstance(s, bytes): + hasbytes = True + else: + raise TypeError('%s() argument must be str or bytes, not %r' % + (funcname, s.__class__.__name__)) from None + if hasstr and hasbytes: + raise TypeError("Can't mix strings and bytes in path components") from None diff --git a/flaskwebproject/FlaskWebProject1/Lib/hashlib.py b/flaskwebproject/FlaskWebProject1/Lib/hashlib.py new file mode 100644 index 0000000..053a7ad --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/hashlib.py @@ -0,0 +1,251 @@ +#. Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org) +# Licensed to PSF under a Contributor Agreement. +# + +__doc__ = """hashlib module - A common interface to many hash functions. + +new(name, data=b'', **kwargs) - returns a new hash object implementing the + given hash function; initializing the hash + using the given binary data. + +Named constructor functions are also available, these are faster +than using new(name): + +md5(), sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s(), +sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256. + +More algorithms may be available on your platform but the above are guaranteed +to exist. See the algorithms_guaranteed and algorithms_available attributes +to find out what algorithm names can be passed to new(). + +NOTE: If you want the adler32 or crc32 hash functions they are available in +the zlib module. + +Choose your hash function wisely. Some have known collision weaknesses. +sha384 and sha512 will be slow on 32 bit platforms. + +Hash objects have these methods: + - update(arg): Update the hash object with the bytes in arg. Repeated calls + are equivalent to a single call with the concatenation of all + the arguments. + - digest(): Return the digest of the bytes passed to the update() method + so far. + - hexdigest(): Like digest() except the digest is returned as a unicode + object of double length, containing only hexadecimal digits. + - copy(): Return a copy (clone) of the hash object. This can be used to + efficiently compute the digests of strings that share a common + initial substring. + +For example, to obtain the digest of the string 'Nobody inspects the +spammish repetition': + + >>> import hashlib + >>> m = hashlib.md5() + >>> m.update(b"Nobody inspects") + >>> m.update(b" the spammish repetition") + >>> m.digest() + b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9' + +More condensed: + + >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() + 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' + +""" + +# This tuple and __get_builtin_constructor() must be modified if a new +# always available algorithm is added. +__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', + 'blake2b', 'blake2s', + 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256') + + +algorithms_guaranteed = set(__always_supported) +algorithms_available = set(__always_supported) + +__all__ = __always_supported + ('new', 'algorithms_guaranteed', + 'algorithms_available', 'pbkdf2_hmac') + + +__builtin_constructor_cache = {} + +def __get_builtin_constructor(name): + cache = __builtin_constructor_cache + constructor = cache.get(name) + if constructor is not None: + return constructor + try: + if name in ('SHA1', 'sha1'): + import _sha1 + cache['SHA1'] = cache['sha1'] = _sha1.sha1 + elif name in ('MD5', 'md5'): + import _md5 + cache['MD5'] = cache['md5'] = _md5.md5 + elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): + import _sha256 + cache['SHA224'] = cache['sha224'] = _sha256.sha224 + cache['SHA256'] = cache['sha256'] = _sha256.sha256 + elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): + import _sha512 + cache['SHA384'] = cache['sha384'] = _sha512.sha384 + cache['SHA512'] = cache['sha512'] = _sha512.sha512 + elif name in ('blake2b', 'blake2s'): + import _blake2 + cache['blake2b'] = _blake2.blake2b + cache['blake2s'] = _blake2.blake2s + elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256'}: + import _sha3 + cache['sha3_224'] = _sha3.sha3_224 + cache['sha3_256'] = _sha3.sha3_256 + cache['sha3_384'] = _sha3.sha3_384 + cache['sha3_512'] = _sha3.sha3_512 + cache['shake_128'] = _sha3.shake_128 + cache['shake_256'] = _sha3.shake_256 + except ImportError: + pass # no extension module, this hash is unsupported. + + constructor = cache.get(name) + if constructor is not None: + return constructor + + raise ValueError('unsupported hash type ' + name) + + +def __get_openssl_constructor(name): + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + return __get_builtin_constructor(name) + try: + f = getattr(_hashlib, 'openssl_' + name) + # Allow the C module to raise ValueError. The function will be + # defined but the hash not actually available thanks to OpenSSL. + f() + # Use the C function directly (very fast) + return f + except (AttributeError, ValueError): + return __get_builtin_constructor(name) + + +def __py_new(name, data=b'', **kwargs): + """new(name, data=b'', **kwargs) - Return a new hashing object using the + named algorithm; optionally initialized with data (which must be bytes). + """ + return __get_builtin_constructor(name)(data, **kwargs) + + +def __hash_new(name, data=b'', **kwargs): + """new(name, data=b'') - Return a new hashing object using the named algorithm; + optionally initialized with data (which must be bytes). + """ + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. + # It does neither support keyed blake2 nor advanced features like + # salt, personal, tree hashing or SSE. + return __get_builtin_constructor(name)(data, **kwargs) + try: + return _hashlib.new(name, data) + except ValueError: + # If the _hashlib module (OpenSSL) doesn't support the named + # hash, try using our builtin implementations. + # This allows for SHA224/256 and SHA384/512 support even though + # the OpenSSL library prior to 0.9.8 doesn't provide them. + return __get_builtin_constructor(name)(data) + + +try: + import _hashlib + new = __hash_new + __get_hash = __get_openssl_constructor + algorithms_available = algorithms_available.union( + _hashlib.openssl_md_meth_names) +except ImportError: + new = __py_new + __get_hash = __get_builtin_constructor + +try: + # OpenSSL's PKCS5_PBKDF2_HMAC requires OpenSSL 1.0+ with HMAC and SHA + from _hashlib import pbkdf2_hmac +except ImportError: + _trans_5C = bytes((x ^ 0x5C) for x in range(256)) + _trans_36 = bytes((x ^ 0x36) for x in range(256)) + + def pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None): + """Password based key derivation function 2 (PKCS #5 v2.0) + + This Python implementations based on the hmac module about as fast + as OpenSSL's PKCS5_PBKDF2_HMAC for short passwords and much faster + for long passwords. + """ + if not isinstance(hash_name, str): + raise TypeError(hash_name) + + if not isinstance(password, (bytes, bytearray)): + password = bytes(memoryview(password)) + if not isinstance(salt, (bytes, bytearray)): + salt = bytes(memoryview(salt)) + + # Fast inline HMAC implementation + inner = new(hash_name) + outer = new(hash_name) + blocksize = getattr(inner, 'block_size', 64) + if len(password) > blocksize: + password = new(hash_name, password).digest() + password = password + b'\x00' * (blocksize - len(password)) + inner.update(password.translate(_trans_36)) + outer.update(password.translate(_trans_5C)) + + def prf(msg, inner=inner, outer=outer): + # PBKDF2_HMAC uses the password as key. We can re-use the same + # digest objects and just update copies to skip initialization. + icpy = inner.copy() + ocpy = outer.copy() + icpy.update(msg) + ocpy.update(icpy.digest()) + return ocpy.digest() + + if iterations < 1: + raise ValueError(iterations) + if dklen is None: + dklen = outer.digest_size + if dklen < 1: + raise ValueError(dklen) + + dkey = b'' + loop = 1 + from_bytes = int.from_bytes + while len(dkey) < dklen: + prev = prf(salt + loop.to_bytes(4, 'big')) + # endianess doesn't matter here as long to / from use the same + rkey = int.from_bytes(prev, 'big') + for i in range(iterations - 1): + prev = prf(prev) + # rkey = rkey ^ prev + rkey ^= from_bytes(prev, 'big') + loop += 1 + dkey += rkey.to_bytes(inner.digest_size, 'big') + + return dkey[:dklen] + +try: + # OpenSSL's scrypt requires OpenSSL 1.1+ + from _hashlib import scrypt +except ImportError: + pass + + +for __func_name in __always_supported: + # try them all, some may not work due to the OpenSSL + # version not supporting that algorithm. + try: + globals()[__func_name] = __get_hash(__func_name) + except ValueError: + import logging + logging.exception('code for hash %s was not found.', __func_name) + + +# Cleanup locals() +del __always_supported, __func_name, __get_hash +del __py_new, __hash_new, __get_openssl_constructor diff --git a/flaskwebproject/FlaskWebProject1/Lib/heapq.py b/flaskwebproject/FlaskWebProject1/Lib/heapq.py new file mode 100644 index 0000000..0b3e89a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/heapq.py @@ -0,0 +1,607 @@ +"""Heap queue algorithm (a.k.a. priority queue). + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +Usage: + +heap = [] # creates an empty heap +heappush(heap, item) # pushes a new item on the heap +item = heappop(heap) # pops the smallest item from the heap +item = heap[0] # smallest item on the heap without popping it +heapify(x) # transforms list into a heap, in-place, in linear time +item = heapreplace(heap, item) # pops and returns smallest item, and adds + # new item; the heap size is unchanged + +Our API differs from textbook heap algorithms as follows: + +- We use 0-based indexing. This makes the relationship between the + index for a node and the indexes for its children slightly less + obvious, but is more suitable since Python uses 0-based indexing. + +- Our heappop() method returns the smallest item, not the largest. + +These two make it possible to view the heap as a regular Python list +without surprises: heap[0] is the smallest item, and heap.sort() +maintains the heap invariant! +""" + +# Original code by Kevin O'Connor, augmented by Tim Peters and Raymond Hettinger + +__about__ = """Heap queues + +[explanation by François Pinard] + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +The strange invariant above is meant to be an efficient memory +representation for a tournament. The numbers below are `k', not a[k]: + + 0 + + 1 2 + + 3 4 5 6 + + 7 8 9 10 11 12 13 14 + + 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + + +In the tree above, each cell `k' is topping `2*k+1' and `2*k+2'. In +a usual binary tournament we see in sports, each cell is the winner +over the two cells it tops, and we can trace the winner down the tree +to see all opponents s/he had. However, in many computer applications +of such tournaments, we do not need to trace the history of a winner. +To be more memory efficient, when a winner is promoted, we try to +replace it by something else at a lower level, and the rule becomes +that a cell and the two cells it tops contain three different items, +but the top cell "wins" over the two topped cells. + +If this heap invariant is protected at all time, index 0 is clearly +the overall winner. The simplest algorithmic way to remove it and +find the "next" winner is to move some loser (let's say cell 30 in the +diagram above) into the 0 position, and then percolate this new 0 down +the tree, exchanging values, until the invariant is re-established. +This is clearly logarithmic on the total number of items in the tree. +By iterating over all items, you get an O(n ln n) sort. + +A nice feature of this sort is that you can efficiently insert new +items while the sort is going on, provided that the inserted items are +not "better" than the last 0'th element you extracted. This is +especially useful in simulation contexts, where the tree holds all +incoming events, and the "win" condition means the smallest scheduled +time. When an event schedule other events for execution, they are +scheduled into the future, so they can easily go into the heap. So, a +heap is a good structure for implementing schedulers (this is what I +used for my MIDI sequencer :-). + +Various structures for implementing schedulers have been extensively +studied, and heaps are good for this, as they are reasonably speedy, +the speed is almost constant, and the worst case is not much different +than the average case. However, there are other representations which +are more efficient overall, yet the worst cases might be terrible. + +Heaps are also very useful in big disk sorts. You most probably all +know that a big sort implies producing "runs" (which are pre-sorted +sequences, which size is usually related to the amount of CPU memory), +followed by a merging passes for these runs, which merging is often +very cleverly organised[1]. It is very important that the initial +sort produces the longest runs possible. Tournaments are a good way +to that. If, using all the memory available to hold a tournament, you +replace and percolate items that happen to fit the current run, you'll +produce runs which are twice the size of the memory for random input, +and much better for input fuzzily ordered. + +Moreover, if you output the 0'th item on disk and get an input which +may not fit in the current tournament (because the value "wins" over +the last output value), it cannot fit in the heap, so the size of the +heap decreases. The freed memory could be cleverly reused immediately +for progressively building a second heap, which grows at exactly the +same rate the first heap is melting. When the first heap completely +vanishes, you switch heaps and start a new run. Clever and quite +effective! + +In a word, heaps are useful memory structures to know. I use them in +a few applications, and I think it is good to keep a `heap' module +around. :-) + +-------------------- +[1] The disk balancing algorithms which are current, nowadays, are +more annoying than clever, and this is a consequence of the seeking +capabilities of the disks. On devices which cannot seek, like big +tape drives, the story was quite different, and one had to be very +clever to ensure (far in advance) that each tape movement will be the +most effective possible (that is, will best participate at +"progressing" the merge). Some tapes were even able to read +backwards, and this was also used to avoid the rewinding time. +Believe me, real good tape sorts were quite spectacular to watch! +From all times, sorting has always been a Great Art! :-) +""" + +__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge', + 'nlargest', 'nsmallest', 'heappushpop'] + +def heappush(heap, item): + """Push item onto heap, maintaining the heap invariant.""" + heap.append(item) + _siftdown(heap, 0, len(heap)-1) + +def heappop(heap): + """Pop the smallest item off the heap, maintaining the heap invariant.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup(heap, 0) + return returnitem + return lastelt + +def heapreplace(heap, item): + """Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed-size heap. Note that the value + returned may be larger than item! That constrains reasonable uses of + this routine unless written as part of a conditional replacement: + + if item > heap[0]: + item = heapreplace(heap, item) + """ + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup(heap, 0) + return returnitem + +def heappushpop(heap, item): + """Fast version of a heappush followed by a heappop.""" + if heap and heap[0] < item: + item, heap[0] = heap[0], item + _siftup(heap, 0) + return item + +def heapify(x): + """Transform list into a heap, in-place, in O(len(x)) time.""" + n = len(x) + # Transform bottom-up. The largest index there's any point to looking at + # is the largest with a child index in-range, so must have 2*i + 1 < n, + # or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so + # j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is + # (2*j+1-1)/2 = j so j-1 is the largest, and that's again n//2-1. + for i in reversed(range(n//2)): + _siftup(x, i) + +def _heappop_max(heap): + """Maxheap version of a heappop.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup_max(heap, 0) + return returnitem + return lastelt + +def _heapreplace_max(heap, item): + """Maxheap version of a heappop followed by a heappush.""" + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup_max(heap, 0) + return returnitem + +def _heapify_max(x): + """Transform list into a maxheap, in-place, in O(len(x)) time.""" + n = len(x) + for i in reversed(range(n//2)): + _siftup_max(x, i) + +# 'heap' is a heap at all indices >= startpos, except possibly for pos. pos +# is the index of a leaf with a possibly out-of-order value. Restore the +# heap invariant. +def _siftdown(heap, startpos, pos): + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if newitem < parent: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +# The child indices of heap index pos are already heaps, and we want to make +# a heap at index pos too. We do this by bubbling the smaller child of +# pos up (and so on with that child's children, etc) until hitting a leaf, +# then using _siftdown to move the oddball originally at index pos into place. +# +# We *could* break out of the loop as soon as we find a pos where newitem <= +# both its children, but turns out that's not a good idea, and despite that +# many books write the algorithm that way. During a heap pop, the last array +# element is sifted in, and that tends to be large, so that comparing it +# against values starting from the root usually doesn't pay (= usually doesn't +# get us out of the loop early). See Knuth, Volume 3, where this is +# explained and quantified in an exercise. +# +# Cutting the # of comparisons is important, since these routines have no +# way to extract "the priority" from an array element, so that intelligence +# is likely to be hiding in custom comparison methods, or in array elements +# storing (priority, record) tuples. Comparisons are thus potentially +# expensive. +# +# On random arrays of length 1000, making this change cut the number of +# comparisons made by heapify() a little, and those made by exhaustive +# heappop() a lot, in accord with theory. Here are typical results from 3 +# runs (3 just to demonstrate how small the variance is): +# +# Compares needed by heapify Compares needed by 1000 heappops +# -------------------------- -------------------------------- +# 1837 cut to 1663 14996 cut to 8680 +# 1855 cut to 1659 14966 cut to 8678 +# 1847 cut to 1660 15024 cut to 8703 +# +# Building the heap by using heappush() 1000 times instead required +# 2198, 2148, and 2219 compares: heapify() is more efficient, when +# you can use it. +# +# The total compares needed by list.sort() on the same lists were 8627, +# 8627, and 8632 (this should be compared to the sum of heapify() and +# heappop() compares): list.sort() is (unsurprisingly!) more efficient +# for sorting. + +def _siftup(heap, pos): + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the smaller child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of smaller child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[childpos] < heap[rightpos]: + childpos = rightpos + # Move the smaller child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown(heap, startpos, pos) + +def _siftdown_max(heap, startpos, pos): + 'Maxheap variant of _siftdown' + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if parent < newitem: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +def _siftup_max(heap, pos): + 'Maxheap variant of _siftup' + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the larger child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of larger child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[rightpos] < heap[childpos]: + childpos = rightpos + # Move the larger child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown_max(heap, startpos, pos) + +def merge(*iterables, key=None, reverse=False): + '''Merge multiple sorted inputs into a single sorted output. + + Similar to sorted(itertools.chain(*iterables)) but returns a generator, + does not pull the data into memory all at once, and assumes that each of + the input streams is already sorted (smallest to largest). + + >>> list(merge([1,3,5,7], [0,2,4,8], [5,10,15,20], [], [25])) + [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25] + + If *key* is not None, applies a key function to each element to determine + its sort order. + + >>> list(merge(['dog', 'horse'], ['cat', 'fish', 'kangaroo'], key=len)) + ['dog', 'cat', 'fish', 'horse', 'kangaroo'] + + ''' + + h = [] + h_append = h.append + + if reverse: + _heapify = _heapify_max + _heappop = _heappop_max + _heapreplace = _heapreplace_max + direction = -1 + else: + _heapify = heapify + _heappop = heappop + _heapreplace = heapreplace + direction = 1 + + if key is None: + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + h_append([next(), order * direction, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + value, order, next = s = h[0] + yield value + s[0] = next() # raises StopIteration when exhausted + _heapreplace(h, s) # restore heap condition + except StopIteration: + _heappop(h) # remove empty iterator + if h: + # fast case when only a single iterator remains + value, order, next = h[0] + yield value + yield from next.__self__ + return + + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + value = next() + h_append([key(value), order * direction, value, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + key_value, order, value, next = s = h[0] + yield value + value = next() + s[0] = key(value) + s[2] = value + _heapreplace(h, s) + except StopIteration: + _heappop(h) + if h: + key_value, order, value, next = h[0] + yield value + yield from next.__self__ + + +# Algorithm notes for nlargest() and nsmallest() +# ============================================== +# +# Make a single pass over the data while keeping the k most extreme values +# in a heap. Memory consumption is limited to keeping k values in a list. +# +# Measured performance for random inputs: +# +# number of comparisons +# n inputs k-extreme values (average of 5 trials) % more than min() +# ------------- ---------------- --------------------- ----------------- +# 1,000 100 3,317 231.7% +# 10,000 100 14,046 40.5% +# 100,000 100 105,749 5.7% +# 1,000,000 100 1,007,751 0.8% +# 10,000,000 100 10,009,401 0.1% +# +# Theoretical number of comparisons for k smallest of n random inputs: +# +# Step Comparisons Action +# ---- -------------------------- --------------------------- +# 1 1.66 * k heapify the first k-inputs +# 2 n - k compare remaining elements to top of heap +# 3 k * (1 + lg2(k)) * ln(n/k) replace the topmost value on the heap +# 4 k * lg2(k) - (k/2) final sort of the k most extreme values +# +# Combining and simplifying for a rough estimate gives: +# +# comparisons = n + k * (log(k, 2) * log(n/k) + log(k, 2) + log(n/k)) +# +# Computing the number of comparisons for step 3: +# ----------------------------------------------- +# * For the i-th new value from the iterable, the probability of being in the +# k most extreme values is k/i. For example, the probability of the 101st +# value seen being in the 100 most extreme values is 100/101. +# * If the value is a new extreme value, the cost of inserting it into the +# heap is 1 + log(k, 2). +# * The probability times the cost gives: +# (k/i) * (1 + log(k, 2)) +# * Summing across the remaining n-k elements gives: +# sum((k/i) * (1 + log(k, 2)) for i in range(k+1, n+1)) +# * This reduces to: +# (H(n) - H(k)) * k * (1 + log(k, 2)) +# * Where H(n) is the n-th harmonic number estimated by: +# gamma = 0.5772156649 +# H(n) = log(n, e) + gamma + 1 / (2 * n) +# http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Rate_of_divergence +# * Substituting the H(n) formula: +# comparisons = k * (1 + log(k, 2)) * (log(n/k, e) + (1/n - 1/k) / 2) +# +# Worst-case for step 3: +# ---------------------- +# In the worst case, the input data is reversed sorted so that every new element +# must be inserted in the heap: +# +# comparisons = 1.66 * k + log(k, 2) * (n - k) +# +# Alternative Algorithms +# ---------------------- +# Other algorithms were not used because they: +# 1) Took much more auxiliary memory, +# 2) Made multiple passes over the data. +# 3) Made more comparisons in common cases (small k, large n, semi-random input). +# See the more detailed comparison of approach at: +# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest + +def nsmallest(n, iterable, key=None): + """Find the n smallest elements in a dataset. + + Equivalent to: sorted(iterable, key=key)[:n] + """ + + # Short-cut for n==1 is to use min() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = min(it, default=sentinel) + else: + result = min(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + # put the range(n) first so that zip() doesn't + # consume one too many elements from the iterator + result = [(elem, i) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + if elem < top: + _heapreplace(result, (elem, order)) + top = result[0][0] + order += 1 + result.sort() + return [r[0] for r in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + k = key(elem) + if k < top: + _heapreplace(result, (k, order, elem)) + top = result[0][0] + order += 1 + result.sort() + return [r[2] for r in result] + +def nlargest(n, iterable, key=None): + """Find the n largest elements in a dataset. + + Equivalent to: sorted(iterable, key=key, reverse=True)[:n] + """ + + # Short-cut for n==1 is to use max() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = max(it, default=sentinel) + else: + result = max(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key, reverse=True)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + if top < elem: + _heapreplace(result, (elem, order)) + top = result[0][0] + order -= 1 + result.sort(reverse=True) + return [r[0] for r in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + k = key(elem) + if top < k: + _heapreplace(result, (k, order, elem)) + top = result[0][0] + order -= 1 + result.sort(reverse=True) + return [r[2] for r in result] + +# If available, use C implementation +try: + from _heapq import * +except ImportError: + pass +try: + from _heapq import _heapreplace_max +except ImportError: + pass +try: + from _heapq import _heapify_max +except ImportError: + pass +try: + from _heapq import _heappop_max +except ImportError: + pass + + +if __name__ == "__main__": + + import doctest + print(doctest.testmod()) diff --git a/flaskwebproject/FlaskWebProject1/Lib/hmac.py b/flaskwebproject/FlaskWebProject1/Lib/hmac.py new file mode 100644 index 0000000..121029a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/hmac.py @@ -0,0 +1,144 @@ +"""HMAC (Keyed-Hashing for Message Authentication) Python module. + +Implements the HMAC algorithm as described by RFC 2104. +""" + +import warnings as _warnings +from _operator import _compare_digest as compare_digest +import hashlib as _hashlib + +trans_5C = bytes((x ^ 0x5C) for x in range(256)) +trans_36 = bytes((x ^ 0x36) for x in range(256)) + +# The size of the digests returned by HMAC depends on the underlying +# hashing module used. Use digest_size from the instance of HMAC instead. +digest_size = None + + + +class HMAC: + """RFC 2104 HMAC class. Also complies with RFC 4231. + + This supports the API for Cryptographic Hash Functions (PEP 247). + """ + blocksize = 64 # 512-bit HMAC; can be changed in subclasses. + + def __init__(self, key, msg = None, digestmod = None): + """Create a new HMAC object. + + key: key for the keyed hash object. + msg: Initial input for the hash, if provided. + digestmod: A module supporting PEP 247. *OR* + A hashlib constructor returning a new hash object. *OR* + A hash name suitable for hashlib.new(). + Defaults to hashlib.md5. + Implicit default to hashlib.md5 is deprecated and will be + removed in Python 3.6. + + Note: key and msg must be a bytes or bytearray objects. + """ + + if not isinstance(key, (bytes, bytearray)): + raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) + + if digestmod is None: + _warnings.warn("HMAC() without an explicit digestmod argument " + "is deprecated.", PendingDeprecationWarning, 2) + digestmod = _hashlib.md5 + + if callable(digestmod): + self.digest_cons = digestmod + elif isinstance(digestmod, str): + self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) + else: + self.digest_cons = lambda d=b'': digestmod.new(d) + + self.outer = self.digest_cons() + self.inner = self.digest_cons() + self.digest_size = self.inner.digest_size + + if hasattr(self.inner, 'block_size'): + blocksize = self.inner.block_size + if blocksize < 16: + _warnings.warn('block_size of %d seems too small; using our ' + 'default of %d.' % (blocksize, self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + else: + _warnings.warn('No block_size attribute on given digest object; ' + 'Assuming %d.' % (self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + + # self.blocksize is the default blocksize. self.block_size is + # effective block size as well as the public API attribute. + self.block_size = blocksize + + if len(key) > blocksize: + key = self.digest_cons(key).digest() + + key = key.ljust(blocksize, b'\0') + self.outer.update(key.translate(trans_5C)) + self.inner.update(key.translate(trans_36)) + if msg is not None: + self.update(msg) + + @property + def name(self): + return "hmac-" + self.inner.name + + def update(self, msg): + """Update this hashing object with the string msg. + """ + self.inner.update(msg) + + def copy(self): + """Return a separate copy of this hashing object. + + An update to this copy won't affect the original object. + """ + # Call __new__ directly to avoid the expensive __init__. + other = self.__class__.__new__(self.__class__) + other.digest_cons = self.digest_cons + other.digest_size = self.digest_size + other.inner = self.inner.copy() + other.outer = self.outer.copy() + return other + + def _current(self): + """Return a hash object for the current state. + + To be used only internally with digest() and hexdigest(). + """ + h = self.outer.copy() + h.update(self.inner.digest()) + return h + + def digest(self): + """Return the hash value of this hashing object. + + This returns a string containing 8-bit data. The object is + not altered in any way by this function; you can continue + updating the object after calling this function. + """ + h = self._current() + return h.digest() + + def hexdigest(self): + """Like digest(), but returns a string of hexadecimal digits instead. + """ + h = self._current() + return h.hexdigest() + +def new(key, msg = None, digestmod = None): + """Create a new hashing object and return it. + + key: The starting key for the hash. + msg: if available, will immediately be hashed into the object's starting + state. + + You can now feed arbitrary strings into the object using its update() + method, and can ask for the hash value at any time by calling its digest() + method. + """ + return HMAC(key, msg, digestmod) diff --git a/flaskwebproject/FlaskWebProject1/Lib/imp.py b/flaskwebproject/FlaskWebProject1/Lib/imp.py new file mode 100644 index 0000000..866464b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/imp.py @@ -0,0 +1,346 @@ +"""This module provides the components needed to build your own __import__ +function. Undocumented functions are obsolete. + +In most cases it is preferred you consider using the importlib module's +functionality over this module. + +""" +# (Probably) need to stay in _imp +from _imp import (lock_held, acquire_lock, release_lock, + get_frozen_object, is_frozen_package, + init_frozen, is_builtin, is_frozen, + _fix_co_filename) +try: + from _imp import create_dynamic +except ImportError: + # Platform doesn't support dynamic loading. + create_dynamic = None + +from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name +from importlib._bootstrap_external import SourcelessFileLoader + +from importlib import machinery +from importlib import util +import importlib +import os +import sys +import tokenize +import types +import warnings + +warnings.warn("the imp module is deprecated in favour of importlib; " + "see the module's documentation for alternative uses", + DeprecationWarning, stacklevel=2) + +# DEPRECATED +SEARCH_ERROR = 0 +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +PY_RESOURCE = 4 +PKG_DIRECTORY = 5 +C_BUILTIN = 6 +PY_FROZEN = 7 +PY_CODERESOURCE = 8 +IMP_HOOK = 9 + + +def new_module(name): + """**DEPRECATED** + + Create a new module. + + The module is not entered into sys.modules. + + """ + return types.ModuleType(name) + + +def get_magic(): + """**DEPRECATED** + + Return the magic number for .pyc files. + """ + return util.MAGIC_NUMBER + + +def get_tag(): + """Return the magic tag for .pyc files.""" + return sys.implementation.cache_tag + + +def cache_from_source(path, debug_override=None): + """**DEPRECATED** + + Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + If debug_override is not None, then it must be a boolean and is used in + place of sys.flags.optimize. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + return util.cache_from_source(path, debug_override) + + +def source_from_cache(path): + """**DEPRECATED** + + Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + return util.source_from_cache(path) + + +def get_suffixes(): + """**DEPRECATED**""" + extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES] + source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] + bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] + + return extensions + source + bytecode + + +class NullImporter: + + """**DEPRECATED** + + Null import object. + + """ + + def __init__(self, path): + if path == '': + raise ImportError('empty pathname', path='') + elif os.path.isdir(path): + raise ImportError('existing directory', path=path) + + def find_module(self, fullname): + """Always returns None.""" + return None + + +class _HackedGetData: + + """Compatibility support for 'file' arguments of various load_*() + functions.""" + + def __init__(self, fullname, path, file=None): + super().__init__(fullname, path) + self.file = file + + def get_data(self, path): + """Gross hack to contort loader to deal w/ load_*()'s bad API.""" + if self.file and path == self.path: + if not self.file.closed: + file = self.file + else: + self.file = file = open(self.path, 'r') + + with file: + # Technically should be returning bytes, but + # SourceLoader.get_code() just passed what is returned to + # compile() which can handle str. And converting to bytes would + # require figuring out the encoding to decode to and + # tokenize.detect_encoding() only accepts bytes. + return file.read() + else: + return super().get_data(path) + + +class _LoadSourceCompatibility(_HackedGetData, machinery.SourceFileLoader): + + """Compatibility support for implementing load_source().""" + + +def load_source(name, pathname, file=None): + loader = _LoadSourceCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = machinery.SourceFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +class _LoadCompiledCompatibility(_HackedGetData, SourcelessFileLoader): + + """Compatibility support for implementing load_compiled().""" + + +def load_compiled(name, pathname, file=None): + """**DEPRECATED**""" + loader = _LoadCompiledCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = SourcelessFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +def load_package(name, path): + """**DEPRECATED**""" + if os.path.isdir(path): + extensions = (machinery.SOURCE_SUFFIXES[:] + + machinery.BYTECODE_SUFFIXES[:]) + for extension in extensions: + init_path = os.path.join(path, '__init__' + extension) + if os.path.exists(init_path): + path = init_path + break + else: + raise ValueError('{!r} is not a package'.format(path)) + spec = util.spec_from_file_location(name, path, + submodule_search_locations=[]) + if name in sys.modules: + return _exec(spec, sys.modules[name]) + else: + return _load(spec) + + +def load_module(name, file, filename, details): + """**DEPRECATED** + + Load a module, given information returned by find_module(). + + The module name must include the full package name, if any. + + """ + suffix, mode, type_ = details + if mode and (not mode.startswith(('r', 'U')) or '+' in mode): + raise ValueError('invalid file open mode {!r}'.format(mode)) + elif file is None and type_ in {PY_SOURCE, PY_COMPILED}: + msg = 'file object required for import (type code {})'.format(type_) + raise ValueError(msg) + elif type_ == PY_SOURCE: + return load_source(name, filename, file) + elif type_ == PY_COMPILED: + return load_compiled(name, filename, file) + elif type_ == C_EXTENSION and load_dynamic is not None: + if file is None: + with open(filename, 'rb') as opened_file: + return load_dynamic(name, filename, opened_file) + else: + return load_dynamic(name, filename, file) + elif type_ == PKG_DIRECTORY: + return load_package(name, filename) + elif type_ == C_BUILTIN: + return init_builtin(name) + elif type_ == PY_FROZEN: + return init_frozen(name) + else: + msg = "Don't know how to import {} (type code {})".format(name, type_) + raise ImportError(msg, name=name) + + +def find_module(name, path=None): + """**DEPRECATED** + + Search for a module. + + If path is omitted or None, search for a built-in, frozen or special + module and continue search in sys.path. The module name cannot + contain '.'; to search for a submodule of a package, pass the + submodule name and the package's __path__. + + """ + if not isinstance(name, str): + raise TypeError("'name' must be a str, not {}".format(type(name))) + elif not isinstance(path, (type(None), list)): + # Backwards-compatibility + raise RuntimeError("'path' must be None or a list, " + "not {}".format(type(path))) + + if path is None: + if is_builtin(name): + return None, None, ('', '', C_BUILTIN) + elif is_frozen(name): + return None, None, ('', '', PY_FROZEN) + else: + path = sys.path + + for entry in path: + package_directory = os.path.join(entry, name) + for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]: + package_file_name = '__init__' + suffix + file_path = os.path.join(package_directory, package_file_name) + if os.path.isfile(file_path): + return None, package_directory, ('', '', PKG_DIRECTORY) + for suffix, mode, type_ in get_suffixes(): + file_name = name + suffix + file_path = os.path.join(entry, file_name) + if os.path.isfile(file_path): + break + else: + continue + break # Break out of outer loop when breaking out of inner loop. + else: + raise ImportError(_ERR_MSG.format(name), name=name) + + encoding = None + if 'b' not in mode: + with open(file_path, 'rb') as file: + encoding = tokenize.detect_encoding(file.readline)[0] + file = open(file_path, mode, encoding=encoding) + return file, file_path, (suffix, mode, type_) + + +def reload(module): + """**DEPRECATED** + + Reload the module and return it. + + The module must have been successfully imported before. + + """ + return importlib.reload(module) + + +def init_builtin(name): + """**DEPRECATED** + + Load and return a built-in module by name, or None is such module doesn't + exist + """ + try: + return _builtin_from_name(name) + except ImportError: + return None + + +if create_dynamic: + def load_dynamic(name, path, file=None): + """**DEPRECATED** + + Load an extension module. + """ + import importlib.machinery + loader = importlib.machinery.ExtensionFileLoader(name, path) + + # Issue #24748: Skip the sys.modules check in _load_module_shim; + # always load new extension + spec = importlib.machinery.ModuleSpec( + name=name, loader=loader, origin=path) + return _load(spec) + +else: + load_dynamic = None diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/__init__.py new file mode 100644 index 0000000..8b11d22 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/__init__.py @@ -0,0 +1,173 @@ +"""A pure Python implementation of import.""" +__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload'] + +# Bootstrap help ##################################################### + +# Until bootstrapping is complete, DO NOT import any modules that attempt +# to import importlib._bootstrap (directly or indirectly). Since this +# partially initialised package would be present in sys.modules, those +# modules would get an uninitialised copy of the source version, instead +# of a fully initialised version (either the frozen one or the one +# initialised below if the frozen one is not available). +import _imp # Just the builtin component, NOT the full Python module +import sys + +try: + import _frozen_importlib as _bootstrap +except ImportError: + from . import _bootstrap + _bootstrap._setup(sys, _imp) +else: + # importlib._bootstrap is the built-in import, ensure we don't create + # a second copy of the module. + _bootstrap.__name__ = 'importlib._bootstrap' + _bootstrap.__package__ = 'importlib' + try: + _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap'] = _bootstrap + +try: + import _frozen_importlib_external as _bootstrap_external +except ImportError: + from . import _bootstrap_external + _bootstrap_external._setup(_bootstrap) + _bootstrap._bootstrap_external = _bootstrap_external +else: + _bootstrap_external.__name__ = 'importlib._bootstrap_external' + _bootstrap_external.__package__ = 'importlib' + try: + _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap_external'] = _bootstrap_external + +# To simplify imports in test code +_w_long = _bootstrap_external._w_long +_r_long = _bootstrap_external._r_long + +# Fully bootstrapped at this point, import whatever you like, circular +# dependencies and startup overhead minimisation permitting :) + +import types +import warnings + + +# Public API ######################################################### + +from ._bootstrap import __import__ + + +def invalidate_caches(): + """Call the invalidate_caches() method on all meta path finders stored in + sys.meta_path (where implemented).""" + for finder in sys.meta_path: + if hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + +def find_loader(name, path=None): + """Return the loader for the specified module. + + This is a backward-compatible wrapper around find_spec(). + + This function is deprecated in favor of importlib.util.find_spec(). + + """ + warnings.warn('Use importlib.util.find_spec() instead.', + DeprecationWarning, stacklevel=2) + try: + loader = sys.modules[name].__loader__ + if loader is None: + raise ValueError('{}.__loader__ is None'.format(name)) + else: + return loader + except KeyError: + pass + except AttributeError: + raise ValueError('{}.__loader__ is not set'.format(name)) from None + + spec = _bootstrap._find_spec(name, path) + # We won't worry about malformed specs (missing attributes). + if spec is None: + return None + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('spec for {} missing loader'.format(name), + name=name) + raise ImportError('namespace packages do not have loaders', + name=name) + return spec.loader + + +def import_module(name, package=None): + """Import a module. + + The 'package' argument is required when performing a relative import. It + specifies the package to use as the anchor point from which to resolve the + relative import to an absolute import. + + """ + level = 0 + if name.startswith('.'): + if not package: + msg = ("the 'package' argument is required to perform a relative " + "import for {!r}") + raise TypeError(msg.format(name)) + for character in name: + if character != '.': + break + level += 1 + return _bootstrap._gcd_import(name[level:], package, level) + + +_RELOADING = {} + + +def reload(module): + """Reload the module and return it. + + The module must have been successfully imported before. + + """ + if not module or not isinstance(module, types.ModuleType): + raise TypeError("reload() argument must be a module") + try: + name = module.__spec__.name + except AttributeError: + name = module.__name__ + + if sys.modules.get(name) is not module: + msg = "module {} not in sys.modules" + raise ImportError(msg.format(name), name=name) + if name in _RELOADING: + return _RELOADING[name] + _RELOADING[name] = module + try: + parent_name = name.rpartition('.')[0] + if parent_name: + try: + parent = sys.modules[parent_name] + except KeyError: + msg = "parent {!r} not in sys.modules" + raise ImportError(msg.format(parent_name), + name=parent_name) from None + else: + pkgpath = parent.__path__ + else: + pkgpath = None + target = module + spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) + _bootstrap._exec(spec, module) + # The module may have replaced itself in sys.modules! + return sys.modules[name] + finally: + try: + del _RELOADING[name] + except KeyError: + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap.py new file mode 100644 index 0000000..e2343dd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap.py @@ -0,0 +1,1161 @@ +"""Core implementation of import. + +This module is NOT meant to be directly imported! It has been designed such +that it can be bootstrapped into Python as the implementation of import. As +such it requires the injection of specific modules and attributes in order to +work. One should use importlib as the public-facing version of this module. + +""" +# +# IMPORTANT: Whenever making changes to this module, be sure to run +# a top-level make in order to get the frozen version of the module +# updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module +# in the early stages of compilation. +# + +# See importlib._setup() for what is injected into the global namespace. + +# When editing this code be aware that code executed at import time CANNOT +# reference any injected objects! This includes not only global code but also +# anything specified at the class level. + +# Bootstrap-related code ###################################################### + +_bootstrap_external = None + +def _wrap(new, old): + """Simple substitute for functools.update_wrapper.""" + for replace in ['__module__', '__name__', '__qualname__', '__doc__']: + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + + +def _new_module(name): + return type(sys)(name) + + +# Module-level locking ######################################################## + +# A dict mapping module names to weakrefs of _ModuleLock instances +# Dictionary protected by the global import lock +_module_locks = {} +# A dict mapping thread ids to _ModuleLock instances +_blocking_on = {} + + +class _DeadlockError(RuntimeError): + pass + + +class _ModuleLock: + """A recursive lock implementation which is able to detect deadlocks + (e.g. thread 1 trying to take locks A then B, and thread 2 trying to + take locks B then A). + """ + + def __init__(self, name): + self.lock = _thread.allocate_lock() + self.wakeup = _thread.allocate_lock() + self.name = name + self.owner = None + self.count = 0 + self.waiters = 0 + + def has_deadlock(self): + # Deadlock avoidance for concurrent circular imports. + me = _thread.get_ident() + tid = self.owner + while True: + lock = _blocking_on.get(tid) + if lock is None: + return False + tid = lock.owner + if tid == me: + return True + + def acquire(self): + """ + Acquire the module lock. If a potential deadlock is detected, + a _DeadlockError is raised. + Otherwise, the lock is always acquired and True is returned. + """ + tid = _thread.get_ident() + _blocking_on[tid] = self + try: + while True: + with self.lock: + if self.count == 0 or self.owner == tid: + self.owner = tid + self.count += 1 + return True + if self.has_deadlock(): + raise _DeadlockError('deadlock detected by %r' % self) + if self.wakeup.acquire(False): + self.waiters += 1 + # Wait for a release() call + self.wakeup.acquire() + self.wakeup.release() + finally: + del _blocking_on[tid] + + def release(self): + tid = _thread.get_ident() + with self.lock: + if self.owner != tid: + raise RuntimeError('cannot release un-acquired lock') + assert self.count > 0 + self.count -= 1 + if self.count == 0: + self.owner = None + if self.waiters: + self.waiters -= 1 + self.wakeup.release() + + def __repr__(self): + return '_ModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _DummyModuleLock: + """A simple _ModuleLock equivalent for Python builds without + multi-threading support.""" + + def __init__(self, name): + self.name = name + self.count = 0 + + def acquire(self): + self.count += 1 + return True + + def release(self): + if self.count == 0: + raise RuntimeError('cannot release un-acquired lock') + self.count -= 1 + + def __repr__(self): + return '_DummyModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _ModuleLockManager: + + def __init__(self, name): + self._name = name + self._lock = None + + def __enter__(self): + self._lock = _get_module_lock(self._name) + self._lock.acquire() + + def __exit__(self, *args, **kwargs): + self._lock.release() + + +# The following two functions are for consumption by Python/import.c. + +def _get_module_lock(name): + """Get or create the module lock for a given module name. + + Acquire/release internally the global import lock to protect + _module_locks.""" + + _imp.acquire_lock() + try: + try: + lock = _module_locks[name]() + except KeyError: + lock = None + + if lock is None: + if _thread is None: + lock = _DummyModuleLock(name) + else: + lock = _ModuleLock(name) + + def cb(ref, name=name): + _imp.acquire_lock() + try: + # bpo-31070: Check if another thread created a new lock + # after the previous lock was destroyed + # but before the weakref callback was called. + if _module_locks.get(name) is ref: + del _module_locks[name] + finally: + _imp.release_lock() + + _module_locks[name] = _weakref.ref(lock, cb) + finally: + _imp.release_lock() + + return lock + + +def _lock_unlock_module(name): + """Acquires then releases the module lock for a given module name. + + This is used to ensure a module is completely initialized, in the + event it is being imported by another thread. + """ + lock = _get_module_lock(name) + try: + lock.acquire() + except _DeadlockError: + # Concurrent circular import, we'll accept a partially initialized + # module object. + pass + else: + lock.release() + +# Frame stripping magic ############################################### +def _call_with_frames_removed(f, *args, **kwds): + """remove_importlib_frames in import.c will always remove sequences + of importlib frames that end with a call to this function + + Use it instead of a normal call in places where including the importlib + frames introduces unwanted noise into the traceback (e.g. when executing + module code) + """ + return f(*args, **kwds) + + +def _verbose_message(message, *args, verbosity=1): + """Print the message to stderr if -v/PYTHONVERBOSE is turned on.""" + if sys.flags.verbose >= verbosity: + if not message.startswith(('#', 'import ')): + message = '# ' + message + print(message.format(*args), file=sys.stderr) + + +def _requires_builtin(fxn): + """Decorator to verify the named module is built-in.""" + def _requires_builtin_wrapper(self, fullname): + if fullname not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_builtin_wrapper, fxn) + return _requires_builtin_wrapper + + +def _requires_frozen(fxn): + """Decorator to verify the named module is frozen.""" + def _requires_frozen_wrapper(self, fullname): + if not _imp.is_frozen(fullname): + raise ImportError('{!r} is not a frozen module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_frozen_wrapper, fxn) + return _requires_frozen_wrapper + + +# Typically used by loader classes as a method replacement. +def _load_module_shim(self, fullname): + """Load the specified module into sys.modules and return it. + + This method is deprecated. Use loader.exec_module instead. + + """ + spec = spec_from_loader(fullname, self) + if fullname in sys.modules: + module = sys.modules[fullname] + _exec(spec, module) + return sys.modules[fullname] + else: + return _load(spec) + +# Module specifications ####################################################### + +def _module_repr(module): + # The implementation of ModuleType.__repr__(). + loader = getattr(module, '__loader__', None) + if hasattr(loader, 'module_repr'): + # As soon as BuiltinImporter, FrozenImporter, and NamespaceLoader + # drop their implementations for module_repr. we can add a + # deprecation warning here. + try: + return loader.module_repr(module) + except Exception: + pass + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return _module_repr_from_spec(spec) + + # We could use module.__class__.__name__ instead of 'module' in the + # various repr permutations. + try: + name = module.__name__ + except AttributeError: + name = '?' + try: + filename = module.__file__ + except AttributeError: + if loader is None: + return ''.format(name) + else: + return ''.format(name, loader) + else: + return ''.format(name, filename) + + +class _installed_safely: + + def __init__(self, module): + self._module = module + self._spec = module.__spec__ + + def __enter__(self): + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes + # wrong) + self._spec._initializing = True + sys.modules[self._spec.name] = self._module + + def __exit__(self, *args): + try: + spec = self._spec + if any(arg is not None for arg in args): + try: + del sys.modules[spec.name] + except KeyError: + pass + else: + _verbose_message('import {!r} # {!r}', spec.name, spec.loader) + finally: + self._spec._initializing = False + + +class ModuleSpec: + """The specification for a module, used for loading. + + A module's spec is the source for information about the module. For + data associated with the module, including source, use the spec's + loader. + + `name` is the absolute name of the module. `loader` is the loader + to use when loading the module. `parent` is the name of the + package the module is in. The parent is derived from the name. + + `is_package` determines if the module is considered a package or + not. On modules this is reflected by the `__path__` attribute. + + `origin` is the specific location used by the loader from which to + load the module, if that information is available. When filename is + set, origin will match. + + `has_location` indicates that a spec's "origin" reflects a location. + When this is True, `__file__` attribute of the module is set. + + `cached` is the location of the cached bytecode file, if any. It + corresponds to the `__cached__` attribute. + + `submodule_search_locations` is the sequence of path entries to + search when importing submodules. If set, is_package should be + True--and False otherwise. + + Packages are simply modules that (may) have submodules. If a spec + has a non-None value in `submodule_search_locations`, the import + system will consider modules loaded from the spec as packages. + + Only finders (see importlib.abc.MetaPathFinder and + importlib.abc.PathEntryFinder) should modify ModuleSpec instances. + + """ + + def __init__(self, name, loader, *, origin=None, loader_state=None, + is_package=None): + self.name = name + self.loader = loader + self.origin = origin + self.loader_state = loader_state + self.submodule_search_locations = [] if is_package else None + + # file-location attributes + self._set_fileattr = False + self._cached = None + + def __repr__(self): + args = ['name={!r}'.format(self.name), + 'loader={!r}'.format(self.loader)] + if self.origin is not None: + args.append('origin={!r}'.format(self.origin)) + if self.submodule_search_locations is not None: + args.append('submodule_search_locations={}' + .format(self.submodule_search_locations)) + return '{}({})'.format(self.__class__.__name__, ', '.join(args)) + + def __eq__(self, other): + smsl = self.submodule_search_locations + try: + return (self.name == other.name and + self.loader == other.loader and + self.origin == other.origin and + smsl == other.submodule_search_locations and + self.cached == other.cached and + self.has_location == other.has_location) + except AttributeError: + return False + + @property + def cached(self): + if self._cached is None: + if self.origin is not None and self._set_fileattr: + if _bootstrap_external is None: + raise NotImplementedError + self._cached = _bootstrap_external._get_cached(self.origin) + return self._cached + + @cached.setter + def cached(self, cached): + self._cached = cached + + @property + def parent(self): + """The name of the module's parent.""" + if self.submodule_search_locations is None: + return self.name.rpartition('.')[0] + else: + return self.name + + @property + def has_location(self): + return self._set_fileattr + + @has_location.setter + def has_location(self, value): + self._set_fileattr = bool(value) + + +def spec_from_loader(name, loader, *, origin=None, is_package=None): + """Return a module spec based on various loader methods.""" + if hasattr(loader, 'get_filename'): + if _bootstrap_external is None: + raise NotImplementedError + spec_from_file_location = _bootstrap_external.spec_from_file_location + + if is_package is None: + return spec_from_file_location(name, loader=loader) + search = [] if is_package else None + return spec_from_file_location(name, loader=loader, + submodule_search_locations=search) + + if is_package is None: + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + is_package = None # aka, undefined + else: + # the default + is_package = False + + return ModuleSpec(name, loader, origin=origin, is_package=is_package) + + +def _spec_from_module(module, loader=None, origin=None): + # This function is meant for use in _setup(). + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return spec + + name = module.__name__ + if loader is None: + try: + loader = module.__loader__ + except AttributeError: + # loader will stay None. + pass + try: + location = module.__file__ + except AttributeError: + location = None + if origin is None: + if location is None: + try: + origin = loader._ORIGIN + except AttributeError: + origin = None + else: + origin = location + try: + cached = module.__cached__ + except AttributeError: + cached = None + try: + submodule_search_locations = list(module.__path__) + except AttributeError: + submodule_search_locations = None + + spec = ModuleSpec(name, loader, origin=origin) + spec._set_fileattr = False if location is None else True + spec.cached = cached + spec.submodule_search_locations = submodule_search_locations + return spec + + +def _init_module_attrs(spec, module, *, override=False): + # The passed-in module may be not support attribute assignment, + # in which case we simply don't set the attributes. + # __name__ + if (override or getattr(module, '__name__', None) is None): + try: + module.__name__ = spec.name + except AttributeError: + pass + # __loader__ + if override or getattr(module, '__loader__', None) is None: + loader = spec.loader + if loader is None: + # A backward compatibility hack. + if spec.submodule_search_locations is not None: + if _bootstrap_external is None: + raise NotImplementedError + _NamespaceLoader = _bootstrap_external._NamespaceLoader + + loader = _NamespaceLoader.__new__(_NamespaceLoader) + loader._path = spec.submodule_search_locations + try: + module.__loader__ = loader + except AttributeError: + pass + # __package__ + if override or getattr(module, '__package__', None) is None: + try: + module.__package__ = spec.parent + except AttributeError: + pass + # __spec__ + try: + module.__spec__ = spec + except AttributeError: + pass + # __path__ + if override or getattr(module, '__path__', None) is None: + if spec.submodule_search_locations is not None: + try: + module.__path__ = spec.submodule_search_locations + except AttributeError: + pass + # __file__/__cached__ + if spec.has_location: + if override or getattr(module, '__file__', None) is None: + try: + module.__file__ = spec.origin + except AttributeError: + pass + + if override or getattr(module, '__cached__', None) is None: + if spec.cached is not None: + try: + module.__cached__ = spec.cached + except AttributeError: + pass + return module + + +def module_from_spec(spec): + """Create a module based on the provided spec.""" + # Typically loaders will not implement create_module(). + module = None + if hasattr(spec.loader, 'create_module'): + # If create_module() returns `None` then it means default + # module creation should be used. + module = spec.loader.create_module(spec) + elif hasattr(spec.loader, 'exec_module'): + raise ImportError('loaders that define exec_module() ' + 'must also define create_module()') + if module is None: + module = _new_module(spec.name) + _init_module_attrs(spec, module) + return module + + +def _module_repr_from_spec(spec): + """Return the repr to use for the module.""" + # We mostly replicate _module_repr() using the spec attributes. + name = '?' if spec.name is None else spec.name + if spec.origin is None: + if spec.loader is None: + return ''.format(name) + else: + return ''.format(name, spec.loader) + else: + if spec.has_location: + return ''.format(name, spec.origin) + else: + return ''.format(spec.name, spec.origin) + + +# Used by importlib.reload() and _load_module_shim(). +def _exec(spec, module): + """Execute the spec's specified module in an existing module's namespace.""" + name = spec.name + with _ModuleLockManager(name): + if sys.modules.get(name) is not module: + msg = 'module {!r} not in sys.modules'.format(name) + raise ImportError(msg, name=name) + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # namespace package + _init_module_attrs(spec, module, override=True) + return module + _init_module_attrs(spec, module, override=True) + if not hasattr(spec.loader, 'exec_module'): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(name) + else: + spec.loader.exec_module(module) + return sys.modules[name] + + +def _load_backward_compatible(spec): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(spec.name) + # The module must be in sys.modules at this point! + module = sys.modules[spec.name] + if getattr(module, '__loader__', None) is None: + try: + module.__loader__ = spec.loader + except AttributeError: + pass + if getattr(module, '__package__', None) is None: + try: + # Since module.__path__ may not line up with + # spec.submodule_search_paths, we can't necessarily rely + # on spec.parent here. + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = spec.name.rpartition('.')[0] + except AttributeError: + pass + if getattr(module, '__spec__', None) is None: + try: + module.__spec__ = spec + except AttributeError: + pass + return module + +def _load_unlocked(spec): + # A helper for direct use by the import system. + if spec.loader is not None: + # not a namespace package + if not hasattr(spec.loader, 'exec_module'): + return _load_backward_compatible(spec) + + module = module_from_spec(spec) + with _installed_safely(module): + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # A namespace package so do nothing. + else: + spec.loader.exec_module(module) + + # We don't ensure that the import-related module attributes get + # set in the sys.modules replacement case. Such modules are on + # their own. + return sys.modules[spec.name] + +# A method used during testing of _load_unlocked() and by +# _load_module_shim(). +def _load(spec): + """Return a new module object, loaded by the spec's loader. + + The module is not added to its parent. + + If a module is already in sys.modules, that existing module gets + clobbered. + + """ + with _ModuleLockManager(spec.name): + return _load_unlocked(spec) + + +# Loaders ##################################################################### + +class BuiltinImporter: + + """Meta path import for built-in modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if path is not None: + return None + if _imp.is_builtin(fullname): + return spec_from_loader(fullname, cls, origin='built-in') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find the built-in module. + + If 'path' is ever specified then the search is considered a failure. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + return spec.loader if spec is not None else None + + @classmethod + def create_module(self, spec): + """Create a built-in module""" + if spec.name not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(spec.name), + name=spec.name) + return _call_with_frames_removed(_imp.create_builtin, spec) + + @classmethod + def exec_module(self, module): + """Exec a built-in module""" + _call_with_frames_removed(_imp.exec_builtin, module) + + @classmethod + @_requires_builtin + def get_code(cls, fullname): + """Return None as built-in modules do not have code objects.""" + return None + + @classmethod + @_requires_builtin + def get_source(cls, fullname): + """Return None as built-in modules do not have source code.""" + return None + + @classmethod + @_requires_builtin + def is_package(cls, fullname): + """Return False as built-in modules are never packages.""" + return False + + load_module = classmethod(_load_module_shim) + + +class FrozenImporter: + + """Meta path import for frozen modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(m): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(m.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if _imp.is_frozen(fullname): + return spec_from_loader(fullname, cls, origin='frozen') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find a frozen module. + + This method is deprecated. Use find_spec() instead. + + """ + return cls if _imp.is_frozen(fullname) else None + + @classmethod + def create_module(cls, spec): + """Use default semantics for module creation.""" + + @staticmethod + def exec_module(module): + name = module.__spec__.name + if not _imp.is_frozen(name): + raise ImportError('{!r} is not a frozen module'.format(name), + name=name) + code = _call_with_frames_removed(_imp.get_frozen_object, name) + exec(code, module.__dict__) + + @classmethod + def load_module(cls, fullname): + """Load a frozen module. + + This method is deprecated. Use exec_module() instead. + + """ + return _load_module_shim(cls, fullname) + + @classmethod + @_requires_frozen + def get_code(cls, fullname): + """Return the code object for the frozen module.""" + return _imp.get_frozen_object(fullname) + + @classmethod + @_requires_frozen + def get_source(cls, fullname): + """Return None as frozen modules do not have source code.""" + return None + + @classmethod + @_requires_frozen + def is_package(cls, fullname): + """Return True if the frozen module is a package.""" + return _imp.is_frozen_package(fullname) + + +# Import itself ############################################################### + +class _ImportLockContext: + + """Context manager for the import lock.""" + + def __enter__(self): + """Acquire the import lock.""" + _imp.acquire_lock() + + def __exit__(self, exc_type, exc_value, exc_traceback): + """Release the import lock regardless of any raised exceptions.""" + _imp.release_lock() + + +def _resolve_name(name, package, level): + """Resolve a relative module name to an absolute one.""" + bits = package.rsplit('.', level - 1) + if len(bits) < level: + raise ValueError('attempted relative import beyond top-level package') + base = bits[0] + return '{}.{}'.format(base, name) if name else base + + +def _find_spec_legacy(finder, name, path): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + loader = finder.find_module(name, path) + if loader is None: + return None + return spec_from_loader(name, loader) + + +def _find_spec(name, path, target=None): + """Find a module's spec.""" + meta_path = sys.meta_path + if meta_path is None: + # PyImport_Cleanup() is running or has been called. + raise ImportError("sys.meta_path is None, Python is likely " + "shutting down") + + if not meta_path: + _warnings.warn('sys.meta_path is empty', ImportWarning) + + # We check sys.modules here for the reload case. While a passed-in + # target will usually indicate a reload there is no guarantee, whereas + # sys.modules provides one. + is_reload = name in sys.modules + for finder in meta_path: + with _ImportLockContext(): + try: + find_spec = finder.find_spec + except AttributeError: + spec = _find_spec_legacy(finder, name, path) + if spec is None: + continue + else: + spec = find_spec(name, path, target) + if spec is not None: + # The parent import may have already imported this module. + if not is_reload and name in sys.modules: + module = sys.modules[name] + try: + __spec__ = module.__spec__ + except AttributeError: + # We use the found spec since that is the one that + # we would have used if the parent module hadn't + # beaten us to the punch. + return spec + else: + if __spec__ is None: + return spec + else: + return __spec__ + else: + return spec + else: + return None + + +def _sanity_check(name, package, level): + """Verify arguments are "sane".""" + if not isinstance(name, str): + raise TypeError('module name must be str, not {}'.format(type(name))) + if level < 0: + raise ValueError('level must be >= 0') + if level > 0: + if not isinstance(package, str): + raise TypeError('__package__ not set to a string') + elif not package: + raise ImportError('attempted relative import with no known parent ' + 'package') + if not name and level == 0: + raise ValueError('Empty module name') + + +_ERR_MSG_PREFIX = 'No module named ' +_ERR_MSG = _ERR_MSG_PREFIX + '{!r}' + +def _find_and_load_unlocked(name, import_): + path = None + parent = name.rpartition('.')[0] + if parent: + if parent not in sys.modules: + _call_with_frames_removed(import_, parent) + # Crazy side-effects! + if name in sys.modules: + return sys.modules[name] + parent_module = sys.modules[parent] + try: + path = parent_module.__path__ + except AttributeError: + msg = (_ERR_MSG + '; {!r} is not a package').format(name, parent) + raise ModuleNotFoundError(msg, name=name) from None + spec = _find_spec(name, path) + if spec is None: + raise ModuleNotFoundError(_ERR_MSG.format(name), name=name) + else: + module = _load_unlocked(spec) + if parent: + # Set the module as an attribute on its parent. + parent_module = sys.modules[parent] + setattr(parent_module, name.rpartition('.')[2], module) + return module + + +_NEEDS_LOADING = object() + + +def _find_and_load(name, import_): + """Find and load the module.""" + with _ModuleLockManager(name): + module = sys.modules.get(name, _NEEDS_LOADING) + if module is _NEEDS_LOADING: + return _find_and_load_unlocked(name, import_) + + if module is None: + message = ('import of {} halted; ' + 'None in sys.modules'.format(name)) + raise ModuleNotFoundError(message, name=name) + + _lock_unlock_module(name) + return module + + +def _gcd_import(name, package=None, level=0): + """Import and return the module based on its name, the package the call is + being made from, and the level adjustment. + + This function represents the greatest common denominator of functionality + between import_module and __import__. This includes setting __package__ if + the loader did not. + + """ + _sanity_check(name, package, level) + if level > 0: + name = _resolve_name(name, package, level) + return _find_and_load(name, _gcd_import) + + +def _handle_fromlist(module, fromlist, import_, *, recursive=False): + """Figure out what __import__ should return. + + The import_ parameter is a callable which takes the name of module to + import. It is required to decouple the function from assuming importlib's + import implementation is desired. + + """ + # The hell that is fromlist ... + # If a package was imported, try to import stuff from fromlist. + if hasattr(module, '__path__'): + for x in fromlist: + if not isinstance(x, str): + if recursive: + where = module.__name__ + '.__all__' + else: + where = "``from list''" + raise TypeError(f"Item in {where} must be str, " + f"not {type(x).__name__}") + elif x == '*': + if not recursive and hasattr(module, '__all__'): + _handle_fromlist(module, module.__all__, import_, + recursive=True) + elif not hasattr(module, x): + from_name = '{}.{}'.format(module.__name__, x) + try: + _call_with_frames_removed(import_, from_name) + except ModuleNotFoundError as exc: + # Backwards-compatibility dictates we ignore failed + # imports triggered by fromlist for modules that don't + # exist. + if (exc.name == from_name and + sys.modules.get(from_name, _NEEDS_LOADING) is not None): + continue + raise + return module + + +def _calc___package__(globals): + """Calculate what __package__ should be. + + __package__ is not guaranteed to be defined or could be set to None + to represent that its proper value is unknown. + + """ + package = globals.get('__package__') + spec = globals.get('__spec__') + if package is not None: + if spec is not None and package != spec.parent: + _warnings.warn("__package__ != __spec__.parent " + f"({package!r} != {spec.parent!r})", + ImportWarning, stacklevel=3) + return package + elif spec is not None: + return spec.parent + else: + _warnings.warn("can't resolve package from __spec__ or __package__, " + "falling back on __name__ and __path__", + ImportWarning, stacklevel=3) + package = globals['__name__'] + if '__path__' not in globals: + package = package.rpartition('.')[0] + return package + + +def __import__(name, globals=None, locals=None, fromlist=(), level=0): + """Import a module. + + The 'globals' argument is used to infer where the import is occurring from + to handle relative imports. The 'locals' argument is ignored. The + 'fromlist' argument specifies what should exist as attributes on the module + being imported (e.g. ``from module import ``). The 'level' + argument represents the package location to import from in a relative + import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). + + """ + if level == 0: + module = _gcd_import(name) + else: + globals_ = globals if globals is not None else {} + package = _calc___package__(globals_) + module = _gcd_import(name, package, level) + if not fromlist: + # Return up to the first dot in 'name'. This is complicated by the fact + # that 'name' may be relative. + if level == 0: + return _gcd_import(name.partition('.')[0]) + elif not name: + return module + else: + # Figure out where to slice the module's name up to the first dot + # in 'name'. + cut_off = len(name) - len(name.partition('.')[0]) + # Slice end needs to be positive to alleviate need to special-case + # when ``'.' not in name``. + return sys.modules[module.__name__[:len(module.__name__)-cut_off]] + else: + return _handle_fromlist(module, fromlist, _gcd_import) + + +def _builtin_from_name(name): + spec = BuiltinImporter.find_spec(name) + if spec is None: + raise ImportError('no built-in module named ' + name) + return _load_unlocked(spec) + + +def _setup(sys_module, _imp_module): + """Setup importlib by importing needed built-in modules and injecting them + into the global namespace. + + As sys is needed for sys.modules access and _imp is needed to load built-in + modules, those two modules must be explicitly passed in. + + """ + global _imp, sys + _imp = _imp_module + sys = sys_module + + # Set up the spec for existing builtin/frozen modules. + module_type = type(sys) + for name, module in sys.modules.items(): + if isinstance(module, module_type): + if name in sys.builtin_module_names: + loader = BuiltinImporter + elif _imp.is_frozen(name): + loader = FrozenImporter + else: + continue + spec = _spec_from_module(module, loader) + _init_module_attrs(spec, module) + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_warnings',): + if builtin_name not in sys.modules: + builtin_module = _builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + # Directly load the _thread module (needed during bootstrap). + try: + thread_module = _builtin_from_name('_thread') + except ImportError: + # Python was built without threads + thread_module = None + setattr(self_module, '_thread', thread_module) + + # Directly load the _weakref module (needed during bootstrap). + weakref_module = _builtin_from_name('_weakref') + setattr(self_module, '_weakref', weakref_module) + + +def _install(sys_module, _imp_module): + """Install importlib as the implementation of import.""" + _setup(sys_module, _imp_module) + + sys.meta_path.append(BuiltinImporter) + sys.meta_path.append(FrozenImporter) + + global _bootstrap_external + import _frozen_importlib_external + _bootstrap_external = _frozen_importlib_external + _frozen_importlib_external._install(sys.modules[__name__]) diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap_external.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap_external.py new file mode 100644 index 0000000..9feec50 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/_bootstrap_external.py @@ -0,0 +1,1443 @@ +"""Core implementation of path-based import. + +This module is NOT meant to be directly imported! It has been designed such +that it can be bootstrapped into Python as the implementation of import. As +such it requires the injection of specific modules and attributes in order to +work. One should use importlib as the public-facing version of this module. + +""" +# +# IMPORTANT: Whenever making changes to this module, be sure to run +# a top-level make in order to get the frozen version of the module +# updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module +# in the early stages of compilation. +# + +# See importlib._setup() for what is injected into the global namespace. + +# When editing this code be aware that code executed at import time CANNOT +# reference any injected objects! This includes not only global code but also +# anything specified at the class level. + +# Bootstrap-related code ###################################################### +_CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win', +_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin' +_CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY + + _CASE_INSENSITIVE_PLATFORMS_STR_KEY) + + +def _make_relax_case(): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS_STR_KEY): + key = 'PYTHONCASEOK' + else: + key = b'PYTHONCASEOK' + + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return key in _os.environ + else: + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return False + return _relax_case + + +def _w_long(x): + """Convert a 32-bit integer to little-endian.""" + return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') + + +def _r_long(int_bytes): + """Convert 4 bytes in little-endian to an integer.""" + return int.from_bytes(int_bytes, 'little') + + +def _path_join(*path_parts): + """Replacement for os.path.join().""" + return path_sep.join([part.rstrip(path_separators) + for part in path_parts if part]) + + +def _path_split(path): + """Replacement for os.path.split().""" + if len(path_separators) == 1: + front, _, tail = path.rpartition(path_sep) + return front, tail + for x in reversed(path): + if x in path_separators: + front, tail = path.rsplit(x, maxsplit=1) + return front, tail + return '', path + + +def _path_stat(path): + """Stat the path. + + Made a separate function to make it easier to override in experiments + (e.g. cache stat results). + + """ + return _os.stat(path) + + +def _path_is_mode_type(path, mode): + """Test whether the path is the specified mode type.""" + try: + stat_info = _path_stat(path) + except OSError: + return False + return (stat_info.st_mode & 0o170000) == mode + + +def _path_isfile(path): + """Replacement for os.path.isfile.""" + return _path_is_mode_type(path, 0o100000) + + +def _path_isdir(path): + """Replacement for os.path.isdir.""" + if not path: + path = _os.getcwd() + return _path_is_mode_type(path, 0o040000) + + +def _write_atomic(path, data, mode=0o666): + """Best-effort function to write data to a path atomically. + Be prepared to handle a FileExistsError if concurrent writing of the + temporary file is attempted.""" + # id() is used to generate a pseudo-random filename. + path_tmp = '{}.{}'.format(path, id(path)) + fd = _os.open(path_tmp, + _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666) + try: + # We first write data to a temporary file, and then use os.replace() to + # perform an atomic rename. + with _io.FileIO(fd, 'wb') as file: + file.write(data) + _os.replace(path_tmp, path) + except OSError: + try: + _os.unlink(path_tmp) + except OSError: + pass + raise + + +_code_type = type(_write_atomic.__code__) + + +# Finder/loader utility code ############################################### + +# Magic word to reject .pyc files generated by other Python versions. +# It should change for each incompatible change to the bytecode. +# +# The value of CR and LF is incorporated so if you ever read or write +# a .pyc file in text mode the magic number will be wrong; also, the +# Apple MPW compiler swaps their values, botching string constants. +# +# There were a variety of old schemes for setting the magic number. +# The current working scheme is to increment the previous value by +# 10. +# +# Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic +# number also includes a new "magic tag", i.e. a human readable string used +# to represent the magic number in __pycache__ directories. When you change +# the magic number, you must also set a new unique magic tag. Generally this +# can be named after the Python major version of the magic number bump, but +# it can really be anything, as long as it's different than anything else +# that's come before. The tags are included in the following table, starting +# with Python 3.2a0. +# +# Known values: +# Python 1.5: 20121 +# Python 1.5.1: 20121 +# Python 1.5.2: 20121 +# Python 1.6: 50428 +# Python 2.0: 50823 +# Python 2.0.1: 50823 +# Python 2.1: 60202 +# Python 2.1.1: 60202 +# Python 2.1.2: 60202 +# Python 2.2: 60717 +# Python 2.3a0: 62011 +# Python 2.3a0: 62021 +# Python 2.3a0: 62011 (!) +# Python 2.4a0: 62041 +# Python 2.4a3: 62051 +# Python 2.4b1: 62061 +# Python 2.5a0: 62071 +# Python 2.5a0: 62081 (ast-branch) +# Python 2.5a0: 62091 (with) +# Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) +# Python 2.5b3: 62101 (fix wrong code: for x, in ...) +# Python 2.5b3: 62111 (fix wrong code: x += yield) +# Python 2.5c1: 62121 (fix wrong lnotab with for loops and +# storing constants that should have been removed) +# Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) +# Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) +# Python 2.6a1: 62161 (WITH_CLEANUP optimization) +# Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND) +# Python 2.7a0: 62181 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) +# Python 2.7a0 62191 (introduce SETUP_WITH) +# Python 2.7a0 62201 (introduce BUILD_SET) +# Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD) +# Python 3000: 3000 +# 3010 (removed UNARY_CONVERT) +# 3020 (added BUILD_SET) +# 3030 (added keyword-only parameters) +# 3040 (added signature annotations) +# 3050 (print becomes a function) +# 3060 (PEP 3115 metaclass syntax) +# 3061 (string literals become unicode) +# 3071 (PEP 3109 raise changes) +# 3081 (PEP 3137 make __file__ and __name__ unicode) +# 3091 (kill str8 interning) +# 3101 (merge from 2.6a0, see 62151) +# 3103 (__file__ points to source file) +# Python 3.0a4: 3111 (WITH_CLEANUP optimization). +# Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT) +# Python 3.1a0: 3141 (optimize list, set and dict comprehensions: +# change LIST_APPEND and SET_ADD, add MAP_ADD) +# Python 3.1a0: 3151 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) +# Python 3.2a0: 3160 (add SETUP_WITH) +# tag: cpython-32 +# Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR) +# tag: cpython-32 +# Python 3.2a2 3180 (add DELETE_DEREF) +# Python 3.3a0 3190 __class__ super closure changed +# Python 3.3a0 3200 (__qualname__ added) +# 3210 (added size modulo 2**32 to the pyc header) +# Python 3.3a1 3220 (changed PEP 380 implementation) +# Python 3.3a4 3230 (revert changes to implicit __class__ closure) +# Python 3.4a1 3250 (evaluate positional default arguments before +# keyword-only defaults) +# Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override +# free vars) +# Python 3.4a1 3270 (various tweaks to the __class__ closure) +# Python 3.4a1 3280 (remove implicit class argument) +# Python 3.4a4 3290 (changes to __qualname__ computation) +# Python 3.4a4 3300 (more changes to __qualname__ computation) +# Python 3.4rc2 3310 (alter __qualname__ computation) +# Python 3.5a0 3320 (matrix multiplication operator) +# Python 3.5b1 3330 (PEP 448: Additional Unpacking Generalizations) +# Python 3.5b2 3340 (fix dictionary display evaluation order #11205) +# Python 3.5b2 3350 (add GET_YIELD_FROM_ITER opcode #24400) +# Python 3.5.2 3351 (fix BUILD_MAP_UNPACK_WITH_CALL opcode #27286) +# Python 3.6a0 3360 (add FORMAT_VALUE opcode #25483 +# Python 3.6a0 3361 (lineno delta of code.co_lnotab becomes signed) +# Python 3.6a1 3370 (16 bit wordcode) +# Python 3.6a1 3371 (add BUILD_CONST_KEY_MAP opcode #27140) +# Python 3.6a1 3372 (MAKE_FUNCTION simplification, remove MAKE_CLOSURE +# #27095) +# Python 3.6b1 3373 (add BUILD_STRING opcode #27078) +# Python 3.6b1 3375 (add SETUP_ANNOTATIONS and STORE_ANNOTATION opcodes +# #27985) +# Python 3.6b1 3376 (simplify CALL_FUNCTIONs & BUILD_MAP_UNPACK_WITH_CALL) +# Python 3.6b1 3377 (set __class__ cell from type.__new__ #23722) +# Python 3.6b2 3378 (add BUILD_TUPLE_UNPACK_WITH_CALL #28257) +# Python 3.6rc1 3379 (more thorough __class__ validation #23722) +# +# MAGIC must change whenever the bytecode emitted by the compiler may no +# longer be understood by older implementations of the eval loop (usually +# due to the addition of new opcodes). +# +# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array +# in PC/launcher.c must also be updated. + +MAGIC_NUMBER = (3379).to_bytes(2, 'little') + b'\r\n' +_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c + +_PYCACHE = '__pycache__' +_OPT = 'opt-' + +SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed. + +BYTECODE_SUFFIXES = ['.pyc'] +# Deprecated. +DEBUG_BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES = BYTECODE_SUFFIXES + +def cache_from_source(path, debug_override=None, *, optimization=None): + """Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + The 'optimization' parameter controls the presumed optimization level of + the bytecode file. If 'optimization' is not None, the string representation + of the argument is taken and verified to be alphanumeric (else ValueError + is raised). + + The debug_override parameter is deprecated. If debug_override is not None, + a True value is the same as setting 'optimization' to the empty string + while a False value is equivalent to setting 'optimization' to '1'. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if debug_override is not None: + _warnings.warn('the debug_override parameter is deprecated; use ' + "'optimization' instead", DeprecationWarning) + if optimization is not None: + message = 'debug_override or optimization must be set to None' + raise TypeError(message) + optimization = '' if debug_override else 1 + path = _os.fspath(path) + head, tail = _path_split(path) + base, sep, rest = tail.rpartition('.') + tag = sys.implementation.cache_tag + if tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + almost_filename = ''.join([(base if base else rest), sep, tag]) + if optimization is None: + if sys.flags.optimize == 0: + optimization = '' + else: + optimization = sys.flags.optimize + optimization = str(optimization) + if optimization != '': + if not optimization.isalnum(): + raise ValueError('{!r} is not alphanumeric'.format(optimization)) + almost_filename = '{}.{}{}'.format(almost_filename, _OPT, optimization) + return _path_join(head, _PYCACHE, almost_filename + BYTECODE_SUFFIXES[0]) + + +def source_from_cache(path): + """Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147/488 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if sys.implementation.cache_tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + path = _os.fspath(path) + head, pycache_filename = _path_split(path) + head, pycache = _path_split(head) + if pycache != _PYCACHE: + raise ValueError('{} not bottom-level directory in ' + '{!r}'.format(_PYCACHE, path)) + dot_count = pycache_filename.count('.') + if dot_count not in {2, 3}: + raise ValueError('expected only 2 or 3 dots in ' + '{!r}'.format(pycache_filename)) + elif dot_count == 3: + optimization = pycache_filename.rsplit('.', 2)[-2] + if not optimization.startswith(_OPT): + raise ValueError("optimization portion of filename does not start " + "with {!r}".format(_OPT)) + opt_level = optimization[len(_OPT):] + if not opt_level.isalnum(): + raise ValueError("optimization level {!r} is not an alphanumeric " + "value".format(optimization)) + base_filename = pycache_filename.partition('.')[0] + return _path_join(head, base_filename + SOURCE_SUFFIXES[0]) + + +def _get_sourcefile(bytecode_path): + """Convert a bytecode file path to a source path (if possible). + + This function exists purely for backwards-compatibility for + PyImport_ExecCodeModuleWithFilenames() in the C API. + + """ + if len(bytecode_path) == 0: + return None + rest, _, extension = bytecode_path.rpartition('.') + if not rest or extension.lower()[-3:-1] != 'py': + return bytecode_path + try: + source_path = source_from_cache(bytecode_path) + except (NotImplementedError, ValueError): + source_path = bytecode_path[:-1] + return source_path if _path_isfile(source_path) else bytecode_path + + +def _get_cached(filename): + if filename.endswith(tuple(SOURCE_SUFFIXES)): + try: + return cache_from_source(filename) + except NotImplementedError: + pass + elif filename.endswith(tuple(BYTECODE_SUFFIXES)): + return filename + else: + return None + + +def _calc_mode(path): + """Calculate the mode permissions for a bytecode file.""" + try: + mode = _path_stat(path).st_mode + except OSError: + mode = 0o666 + # We always ensure write access so we can update cached files + # later even when the source files are read-only on Windows (#6074) + mode |= 0o200 + return mode + + +def _check_name(method): + """Decorator to verify that the module being requested matches the one the + loader can handle. + + The first argument (self) must define _name which the second argument is + compared against. If the comparison fails then ImportError is raised. + + """ + def _check_name_wrapper(self, name=None, *args, **kwargs): + if name is None: + name = self.name + elif self.name != name: + raise ImportError('loader for %s cannot handle %s' % + (self.name, name), name=name) + return method(self, name, *args, **kwargs) + try: + _wrap = _bootstrap._wrap + except NameError: + # XXX yuck + def _wrap(new, old): + for replace in ['__module__', '__name__', '__qualname__', '__doc__']: + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + _wrap(_check_name_wrapper, method) + return _check_name_wrapper + + +def _find_module_shim(self, fullname): + """Try to find a loader for the specified module by delegating to + self.find_loader(). + + This method is deprecated in favor of finder.find_spec(). + + """ + # Call find_loader(). If it returns a string (indicating this + # is a namespace package portion), generate a warning and + # return None. + loader, portions = self.find_loader(fullname) + if loader is None and len(portions): + msg = 'Not importing directory {}: missing __init__' + _warnings.warn(msg.format(portions[0]), ImportWarning) + return loader + + +def _validate_bytecode_header(data, source_stats=None, name=None, path=None): + """Validate the header of the passed-in bytecode against source_stats (if + given) and returning the bytecode that can be compiled by compile(). + + All other arguments are used to enhance error reporting. + + ImportError is raised when the magic number is incorrect or the bytecode is + found to be stale. EOFError is raised when the data is found to be + truncated. + + """ + exc_details = {} + if name is not None: + exc_details['name'] = name + else: + # To prevent having to make all messages have a conditional name. + name = '' + if path is not None: + exc_details['path'] = path + magic = data[:4] + raw_timestamp = data[4:8] + raw_size = data[8:12] + if magic != MAGIC_NUMBER: + message = 'bad magic number in {!r}: {!r}'.format(name, magic) + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + elif len(raw_timestamp) != 4: + message = 'reached EOF while reading timestamp in {!r}'.format(name) + _bootstrap._verbose_message('{}', message) + raise EOFError(message) + elif len(raw_size) != 4: + message = 'reached EOF while reading size of source in {!r}'.format(name) + _bootstrap._verbose_message('{}', message) + raise EOFError(message) + if source_stats is not None: + try: + source_mtime = int(source_stats['mtime']) + except KeyError: + pass + else: + if _r_long(raw_timestamp) != source_mtime: + message = 'bytecode is stale for {!r}'.format(name) + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + try: + source_size = source_stats['size'] & 0xFFFFFFFF + except KeyError: + pass + else: + if _r_long(raw_size) != source_size: + raise ImportError('bytecode is stale for {!r}'.format(name), + **exc_details) + return data[12:] + + +def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None): + """Compile bytecode as returned by _validate_bytecode_header().""" + code = marshal.loads(data) + if isinstance(code, _code_type): + _bootstrap._verbose_message('code object from {!r}', bytecode_path) + if source_path is not None: + _imp._fix_co_filename(code, source_path) + return code + else: + raise ImportError('Non-code object in {!r}'.format(bytecode_path), + name=name, path=bytecode_path) + +def _code_to_bytecode(code, mtime=0, source_size=0): + """Compile a code object into bytecode for writing out to a byte-compiled + file.""" + data = bytearray(MAGIC_NUMBER) + data.extend(_w_long(mtime)) + data.extend(_w_long(source_size)) + data.extend(marshal.dumps(code)) + return data + + +def decode_source(source_bytes): + """Decode bytes representing source code and return the string. + + Universal newline support is used in the decoding. + """ + import tokenize # To avoid bootstrap issues. + source_bytes_readline = _io.BytesIO(source_bytes).readline + encoding = tokenize.detect_encoding(source_bytes_readline) + newline_decoder = _io.IncrementalNewlineDecoder(None, True) + return newline_decoder.decode(source_bytes.decode(encoding[0])) + + +# Module specifications ####################################################### + +_POPULATE = object() + + +def spec_from_file_location(name, location=None, *, loader=None, + submodule_search_locations=_POPULATE): + """Return a module spec based on a file location. + + To indicate that the module is a package, set + submodule_search_locations to a list of directory paths. An + empty list is sufficient, though its not otherwise useful to the + import system. + + The loader must take a spec as its only __init__() arg. + + """ + if location is None: + # The caller may simply want a partially populated location- + # oriented spec. So we set the location to a bogus value and + # fill in as much as we can. + location = '' + if hasattr(loader, 'get_filename'): + # ExecutionLoader + try: + location = loader.get_filename(name) + except ImportError: + pass + else: + location = _os.fspath(location) + + # If the location is on the filesystem, but doesn't actually exist, + # we could return None here, indicating that the location is not + # valid. However, we don't have a good way of testing since an + # indirect location (e.g. a zip file or URL) will look like a + # non-existent file relative to the filesystem. + + spec = _bootstrap.ModuleSpec(name, loader, origin=location) + spec._set_fileattr = True + + # Pick a loader if one wasn't provided. + if loader is None: + for loader_class, suffixes in _get_supported_file_loaders(): + if location.endswith(tuple(suffixes)): + loader = loader_class(name, location) + spec.loader = loader + break + else: + return None + + # Set submodule_search_paths appropriately. + if submodule_search_locations is _POPULATE: + # Check the loader. + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + pass + else: + if is_package: + spec.submodule_search_locations = [] + else: + spec.submodule_search_locations = submodule_search_locations + if spec.submodule_search_locations == []: + if location: + dirname = _path_split(location)[0] + spec.submodule_search_locations.append(dirname) + + return spec + + +# Loaders ##################################################################### + +class WindowsRegistryFinder: + + """Meta path finder for modules declared in the Windows registry.""" + + REGISTRY_KEY = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}') + REGISTRY_KEY_DEBUG = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}\\Debug') + DEBUG_BUILD = False # Changed in _setup() + + @classmethod + def _open_registry(cls, key): + try: + return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) + except OSError: + return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) + + @classmethod + def _search_registry(cls, fullname): + if cls.DEBUG_BUILD: + registry_key = cls.REGISTRY_KEY_DEBUG + else: + registry_key = cls.REGISTRY_KEY + key = registry_key.format(fullname=fullname, + sys_version='%d.%d' % sys.version_info[:2]) + try: + with cls._open_registry(key) as hkey: + filepath = _winreg.QueryValue(hkey, '') + except OSError: + return None + return filepath + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + filepath = cls._search_registry(fullname) + if filepath is None: + return None + try: + _path_stat(filepath) + except OSError: + return None + for loader, suffixes in _get_supported_file_loaders(): + if filepath.endswith(tuple(suffixes)): + spec = _bootstrap.spec_from_loader(fullname, + loader(fullname, filepath), + origin=filepath) + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """Find module named in the registry. + + This method is deprecated. Use exec_module() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is not None: + return spec.loader + else: + return None + + +class _LoaderBasics: + + """Base class of common code needed by both SourceLoader and + SourcelessFileLoader.""" + + def is_package(self, fullname): + """Concrete implementation of InspectLoader.is_package by checking if + the path returned by get_filename has a filename of '__init__.py'.""" + filename = _path_split(self.get_filename(fullname))[1] + filename_base = filename.rsplit('.', 1)[0] + tail_name = fullname.rpartition('.')[2] + return filename_base == '__init__' and tail_name != '__init__' + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + """Execute the module.""" + code = self.get_code(module.__name__) + if code is None: + raise ImportError('cannot load module {!r} when get_code() ' + 'returns None'.format(module.__name__)) + _bootstrap._call_with_frames_removed(exec, code, module.__dict__) + + def load_module(self, fullname): + """This module is deprecated.""" + return _bootstrap._load_module_shim(self, fullname) + + +class SourceLoader(_LoaderBasics): + + def path_mtime(self, path): + """Optional method that returns the modification time (an int) for the + specified path, where path is a str. + + Raises IOError when the path cannot be handled. + """ + raise IOError + + def path_stats(self, path): + """Optional method returning a metadata dict for the specified path + to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + + Implementing this method allows the loader to read bytecode files. + Raises IOError when the path cannot be handled. + """ + return {'mtime': self.path_mtime(path)} + + def _cache_bytecode(self, source_path, cache_path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + + The source path is needed in order to correctly transfer permissions + """ + # For backwards compatibility, we delegate to set_data() + return self.set_data(cache_path, data) + + def set_data(self, path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + """ + + + def get_source(self, fullname): + """Concrete implementation of InspectLoader.get_source.""" + path = self.get_filename(fullname) + try: + source_bytes = self.get_data(path) + except OSError as exc: + raise ImportError('source not available through get_data()', + name=fullname) from exc + return decode_source(source_bytes) + + def source_to_code(self, data, path, *, _optimize=-1): + """Return the code object compiled from source. + + The 'data' argument can be any object type that compile() supports. + """ + return _bootstrap._call_with_frames_removed(compile, data, path, 'exec', + dont_inherit=True, optimize=_optimize) + + def get_code(self, fullname): + """Concrete implementation of InspectLoader.get_code. + + Reading of bytecode requires path_stats to be implemented. To write + bytecode, set_data must also be implemented. + + """ + source_path = self.get_filename(fullname) + source_mtime = None + try: + bytecode_path = cache_from_source(source_path) + except NotImplementedError: + bytecode_path = None + else: + try: + st = self.path_stats(source_path) + except IOError: + pass + else: + source_mtime = int(st['mtime']) + try: + data = self.get_data(bytecode_path) + except OSError: + pass + else: + try: + bytes_data = _validate_bytecode_header(data, + source_stats=st, name=fullname, + path=bytecode_path) + except (ImportError, EOFError): + pass + else: + _bootstrap._verbose_message('{} matches {}', bytecode_path, + source_path) + return _compile_bytecode(bytes_data, name=fullname, + bytecode_path=bytecode_path, + source_path=source_path) + source_bytes = self.get_data(source_path) + code_object = self.source_to_code(source_bytes, source_path) + _bootstrap._verbose_message('code object from {}', source_path) + if (not sys.dont_write_bytecode and bytecode_path is not None and + source_mtime is not None): + data = _code_to_bytecode(code_object, source_mtime, + len(source_bytes)) + try: + self._cache_bytecode(source_path, bytecode_path, data) + _bootstrap._verbose_message('wrote {!r}', bytecode_path) + except NotImplementedError: + pass + return code_object + + +class FileLoader: + + """Base file loader class which implements the loader protocol methods that + require file system usage.""" + + def __init__(self, fullname, path): + """Cache the module name and the path to the file found by the + finder.""" + self.name = fullname + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + @_check_name + def load_module(self, fullname): + """Load a module from a file. + + This method is deprecated. Use exec_module() instead. + + """ + # The only reason for this method is for the name check. + # Issue #14857: Avoid the zero-argument form of super so the implementation + # of that form can be updated without breaking the frozen module + return super(FileLoader, self).load_module(fullname) + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + def get_data(self, path): + """Return the data from path as raw bytes.""" + with _io.FileIO(path, 'r') as file: + return file.read() + + +class SourceFileLoader(FileLoader, SourceLoader): + + """Concrete implementation of SourceLoader using the file system.""" + + def path_stats(self, path): + """Return the metadata for the path.""" + st = _path_stat(path) + return {'mtime': st.st_mtime, 'size': st.st_size} + + def _cache_bytecode(self, source_path, bytecode_path, data): + # Adapt between the two APIs + mode = _calc_mode(source_path) + return self.set_data(bytecode_path, data, _mode=mode) + + def set_data(self, path, data, *, _mode=0o666): + """Write bytes data to a file.""" + parent, filename = _path_split(path) + path_parts = [] + # Figure out what directories are missing. + while parent and not _path_isdir(parent): + parent, part = _path_split(parent) + path_parts.append(part) + # Create needed directories. + for part in reversed(path_parts): + parent = _path_join(parent, part) + try: + _os.mkdir(parent) + except FileExistsError: + # Probably another Python process already created the dir. + continue + except OSError as exc: + # Could be a permission error, read-only filesystem: just forget + # about writing the data. + _bootstrap._verbose_message('could not create {!r}: {!r}', + parent, exc) + return + try: + _write_atomic(path, data, _mode) + _bootstrap._verbose_message('created {!r}', path) + except OSError as exc: + # Same as above: just don't write the bytecode. + _bootstrap._verbose_message('could not create {!r}: {!r}', path, + exc) + + +class SourcelessFileLoader(FileLoader, _LoaderBasics): + + """Loader which handles sourceless file imports.""" + + def get_code(self, fullname): + path = self.get_filename(fullname) + data = self.get_data(path) + bytes_data = _validate_bytecode_header(data, name=fullname, path=path) + return _compile_bytecode(bytes_data, name=fullname, bytecode_path=path) + + def get_source(self, fullname): + """Return None as there is no source code.""" + return None + + +# Filled in by _setup(). +EXTENSION_SUFFIXES = [] + + +class ExtensionFileLoader(FileLoader, _LoaderBasics): + + """Loader for extension modules. + + The constructor is designed to work with FileFinder. + + """ + + def __init__(self, name, path): + self.name = name + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + def create_module(self, spec): + """Create an unitialized extension module""" + module = _bootstrap._call_with_frames_removed( + _imp.create_dynamic, spec) + _bootstrap._verbose_message('extension module {!r} loaded from {!r}', + spec.name, self.path) + return module + + def exec_module(self, module): + """Initialize an extension module""" + _bootstrap._call_with_frames_removed(_imp.exec_dynamic, module) + _bootstrap._verbose_message('extension module {!r} executed from {!r}', + self.name, self.path) + + def is_package(self, fullname): + """Return True if the extension module is a package.""" + file_name = _path_split(self.path)[1] + return any(file_name == '__init__' + suffix + for suffix in EXTENSION_SUFFIXES) + + def get_code(self, fullname): + """Return None as an extension module cannot create a code object.""" + return None + + def get_source(self, fullname): + """Return None as extension modules have no source code.""" + return None + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + +class _NamespacePath: + """Represents a namespace package's path. It uses the module name + to find its parent module, and from there it looks up the parent's + __path__. When this changes, the module's own path is recomputed, + using path_finder. For top-level modules, the parent module's path + is sys.path.""" + + def __init__(self, name, path, path_finder): + self._name = name + self._path = path + self._last_parent_path = tuple(self._get_parent_path()) + self._path_finder = path_finder + + def _find_parent_path_names(self): + """Returns a tuple of (parent-module-name, parent-path-attr-name)""" + parent, dot, me = self._name.rpartition('.') + if dot == '': + # This is a top-level module. sys.path contains the parent path. + return 'sys', 'path' + # Not a top-level module. parent-module.__path__ contains the + # parent path. + return parent, '__path__' + + def _get_parent_path(self): + parent_module_name, path_attr_name = self._find_parent_path_names() + return getattr(sys.modules[parent_module_name], path_attr_name) + + def _recalculate(self): + # If the parent's path has changed, recalculate _path + parent_path = tuple(self._get_parent_path()) # Make a copy + if parent_path != self._last_parent_path: + spec = self._path_finder(self._name, parent_path) + # Note that no changes are made if a loader is returned, but we + # do remember the new parent path + if spec is not None and spec.loader is None: + if spec.submodule_search_locations: + self._path = spec.submodule_search_locations + self._last_parent_path = parent_path # Save the copy + return self._path + + def __iter__(self): + return iter(self._recalculate()) + + def __setitem__(self, index, path): + self._path[index] = path + + def __len__(self): + return len(self._recalculate()) + + def __repr__(self): + return '_NamespacePath({!r})'.format(self._path) + + def __contains__(self, item): + return item in self._recalculate() + + def append(self, item): + self._path.append(item) + + +# We use this exclusively in module_from_spec() for backward-compatibility. +class _NamespaceLoader: + def __init__(self, name, path, path_finder): + self._path = _NamespacePath(name, path, path_finder) + + @classmethod + def module_repr(cls, module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + def is_package(self, fullname): + return True + + def get_source(self, fullname): + return '' + + def get_code(self, fullname): + return compile('', '', 'exec', dont_inherit=True) + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + pass + + def load_module(self, fullname): + """Load a namespace module. + + This method is deprecated. Use exec_module() instead. + + """ + # The import system never calls this method. + _bootstrap._verbose_message('namespace module loaded with path {!r}', + self._path) + return _bootstrap._load_module_shim(self, fullname) + + +# Finders ##################################################################### + +class PathFinder: + + """Meta path finder for sys.path and package __path__ attributes.""" + + @classmethod + def invalidate_caches(cls): + """Call the invalidate_caches() method on all path entry finders + stored in sys.path_importer_caches (where implemented).""" + for finder in sys.path_importer_cache.values(): + if hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + @classmethod + def _path_hooks(cls, path): + """Search sys.path_hooks for a finder for 'path'.""" + if sys.path_hooks is not None and not sys.path_hooks: + _warnings.warn('sys.path_hooks is empty', ImportWarning) + for hook in sys.path_hooks: + try: + return hook(path) + except ImportError: + continue + else: + return None + + @classmethod + def _path_importer_cache(cls, path): + """Get the finder for the path entry from sys.path_importer_cache. + + If the path entry is not in the cache, find the appropriate finder + and cache it. If no finder is available, store None. + + """ + if path == '': + try: + path = _os.getcwd() + except FileNotFoundError: + # Don't cache the failure as the cwd can easily change to + # a valid directory later on. + return None + try: + finder = sys.path_importer_cache[path] + except KeyError: + finder = cls._path_hooks(path) + sys.path_importer_cache[path] = finder + return finder + + @classmethod + def _legacy_get_spec(cls, fullname, finder): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + if hasattr(finder, 'find_loader'): + loader, portions = finder.find_loader(fullname) + else: + loader = finder.find_module(fullname) + portions = [] + if loader is not None: + return _bootstrap.spec_from_loader(fullname, loader) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = portions + return spec + + @classmethod + def _get_spec(cls, fullname, path, target=None): + """Find the loader or namespace_path for this module/package name.""" + # If this ends up being a namespace package, namespace_path is + # the list of paths that will become its __path__ + namespace_path = [] + for entry in path: + if not isinstance(entry, (str, bytes)): + continue + finder = cls._path_importer_cache(entry) + if finder is not None: + if hasattr(finder, 'find_spec'): + spec = finder.find_spec(fullname, target) + else: + spec = cls._legacy_get_spec(fullname, finder) + if spec is None: + continue + if spec.loader is not None: + return spec + portions = spec.submodule_search_locations + if portions is None: + raise ImportError('spec missing loader') + # This is possibly part of a namespace package. + # Remember these path entries (if any) for when we + # create a namespace package, and continue iterating + # on path. + namespace_path.extend(portions) + else: + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = namespace_path + return spec + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + """Try to find a spec for 'fullname' on sys.path or 'path'. + + The search is based on sys.path_hooks and sys.path_importer_cache. + """ + if path is None: + path = sys.path + spec = cls._get_spec(fullname, path, target) + if spec is None: + return None + elif spec.loader is None: + namespace_path = spec.submodule_search_locations + if namespace_path: + # We found at least one namespace path. Return a + # spec which can create the namespace package. + spec.origin = 'namespace' + spec.submodule_search_locations = _NamespacePath(fullname, namespace_path, cls._get_spec) + return spec + else: + return None + else: + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """find the module on sys.path or 'path' based on sys.path_hooks and + sys.path_importer_cache. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is None: + return None + return spec.loader + + +class FileFinder: + + """File-based finder. + + Interactions with the file system are cached for performance, being + refreshed when the directory the finder is handling has been modified. + + """ + + def __init__(self, path, *loader_details): + """Initialize with the path to search on and a variable number of + 2-tuples containing the loader and the file suffixes the loader + recognizes.""" + loaders = [] + for loader, suffixes in loader_details: + loaders.extend((suffix, loader) for suffix in suffixes) + self._loaders = loaders + # Base (directory) path + self.path = path or '.' + self._path_mtime = -1 + self._path_cache = set() + self._relaxed_path_cache = set() + + def invalidate_caches(self): + """Invalidate the directory mtime.""" + self._path_mtime = -1 + + find_module = _find_module_shim + + def find_loader(self, fullname): + """Try to find a loader for the specified module, or the namespace + package portions. Returns (loader, list-of-portions). + + This method is deprecated. Use find_spec() instead. + + """ + spec = self.find_spec(fullname) + if spec is None: + return None, [] + return spec.loader, spec.submodule_search_locations or [] + + def _get_spec(self, loader_class, fullname, path, smsl, target): + loader = loader_class(fullname, path) + return spec_from_file_location(fullname, path, loader=loader, + submodule_search_locations=smsl) + + def find_spec(self, fullname, target=None): + """Try to find a spec for the specified module. + + Returns the matching spec, or None if not found. + """ + is_namespace = False + tail_module = fullname.rpartition('.')[2] + try: + mtime = _path_stat(self.path or _os.getcwd()).st_mtime + except OSError: + mtime = -1 + if mtime != self._path_mtime: + self._fill_cache() + self._path_mtime = mtime + # tail_module keeps the original casing, for __file__ and friends + if _relax_case(): + cache = self._relaxed_path_cache + cache_module = tail_module.lower() + else: + cache = self._path_cache + cache_module = tail_module + # Check if the module is the name of a directory (and thus a package). + if cache_module in cache: + base_path = _path_join(self.path, tail_module) + for suffix, loader_class in self._loaders: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, [base_path], target) + else: + # If a namespace package, return the path if we don't + # find a module in the next section. + is_namespace = _path_isdir(base_path) + # Check for a file w/ a proper suffix exists. + for suffix, loader_class in self._loaders: + full_path = _path_join(self.path, tail_module + suffix) + _bootstrap._verbose_message('trying {}', full_path, verbosity=2) + if cache_module + suffix in cache: + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, + None, target) + if is_namespace: + _bootstrap._verbose_message('possible namespace for {}', base_path) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = [base_path] + return spec + return None + + def _fill_cache(self): + """Fill the cache of potential modules and packages for this directory.""" + path = self.path + try: + contents = _os.listdir(path or _os.getcwd()) + except (FileNotFoundError, PermissionError, NotADirectoryError): + # Directory has either been removed, turned into a file, or made + # unreadable. + contents = [] + # We store two cached versions, to handle runtime changes of the + # PYTHONCASEOK environment variable. + if not sys.platform.startswith('win'): + self._path_cache = set(contents) + else: + # Windows users can import modules with case-insensitive file + # suffixes (for legacy reasons). Make the suffix lowercase here + # so it's done once instead of for every import. This is safe as + # the specified suffixes to check against are always specified in a + # case-sensitive manner. + lower_suffix_contents = set() + for item in contents: + name, dot, suffix = item.partition('.') + if dot: + new_name = '{}.{}'.format(name, suffix.lower()) + else: + new_name = name + lower_suffix_contents.add(new_name) + self._path_cache = lower_suffix_contents + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + self._relaxed_path_cache = {fn.lower() for fn in contents} + + @classmethod + def path_hook(cls, *loader_details): + """A class method which returns a closure to use on sys.path_hook + which will return an instance using the specified loaders and the path + called on the closure. + + If the path called on the closure is not a directory, ImportError is + raised. + + """ + def path_hook_for_FileFinder(path): + """Path hook for importlib.machinery.FileFinder.""" + if not _path_isdir(path): + raise ImportError('only directories are supported', path=path) + return cls(path, *loader_details) + + return path_hook_for_FileFinder + + def __repr__(self): + return 'FileFinder({!r})'.format(self.path) + + +# Import setup ############################################################### + +def _fix_up_module(ns, name, pathname, cpathname=None): + # This function is used by PyImport_ExecCodeModuleObject(). + loader = ns.get('__loader__') + spec = ns.get('__spec__') + if not loader: + if spec: + loader = spec.loader + elif pathname == cpathname: + loader = SourcelessFileLoader(name, pathname) + else: + loader = SourceFileLoader(name, pathname) + if not spec: + spec = spec_from_file_location(name, pathname, loader=loader) + try: + ns['__spec__'] = spec + ns['__loader__'] = loader + ns['__file__'] = pathname + ns['__cached__'] = cpathname + except Exception: + # Not important enough to report. + pass + + +def _get_supported_file_loaders(): + """Returns a list of file-based module loaders. + + Each item is a tuple (loader, suffixes). + """ + extensions = ExtensionFileLoader, _imp.extension_suffixes() + source = SourceFileLoader, SOURCE_SUFFIXES + bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES + return [extensions, source, bytecode] + + +def _setup(_bootstrap_module): + """Setup the path-based importers for importlib by importing needed + built-in modules and injecting them into the global namespace. + + Other components are extracted from the core bootstrap module. + + """ + global sys, _imp, _bootstrap + _bootstrap = _bootstrap_module + sys = _bootstrap.sys + _imp = _bootstrap._imp + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): + if builtin_name not in sys.modules: + builtin_module = _bootstrap._builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + # Directly load the os module (needed during bootstrap). + os_details = ('posix', ['/']), ('nt', ['\\', '/']) + for builtin_os, path_separators in os_details: + # Assumption made in _path_join() + assert all(len(sep) == 1 for sep in path_separators) + path_sep = path_separators[0] + if builtin_os in sys.modules: + os_module = sys.modules[builtin_os] + break + else: + try: + os_module = _bootstrap._builtin_from_name(builtin_os) + break + except ImportError: + continue + else: + raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) + setattr(self_module, 'path_sep', path_sep) + setattr(self_module, 'path_separators', ''.join(path_separators)) + + # Directly load the _thread module (needed during bootstrap). + try: + thread_module = _bootstrap._builtin_from_name('_thread') + except ImportError: + # Python was built without threads + thread_module = None + setattr(self_module, '_thread', thread_module) + + # Directly load the _weakref module (needed during bootstrap). + weakref_module = _bootstrap._builtin_from_name('_weakref') + setattr(self_module, '_weakref', weakref_module) + + # Directly load the winreg module (needed during bootstrap). + if builtin_os == 'nt': + winreg_module = _bootstrap._builtin_from_name('winreg') + setattr(self_module, '_winreg', winreg_module) + + # Constants + setattr(self_module, '_relax_case', _make_relax_case()) + EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) + if builtin_os == 'nt': + SOURCE_SUFFIXES.append('.pyw') + if '_d.pyd' in EXTENSION_SUFFIXES: + WindowsRegistryFinder.DEBUG_BUILD = True + + +def _install(_bootstrap_module): + """Install the path-based import components.""" + _setup(_bootstrap_module) + supported_loaders = _get_supported_file_loaders() + sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) + sys.meta_path.append(PathFinder) diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/abc.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/abc.py new file mode 100644 index 0000000..daff681 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/abc.py @@ -0,0 +1,329 @@ +"""Abstract base classes related to import.""" +from . import _bootstrap +from . import _bootstrap_external +from . import machinery +try: + import _frozen_importlib +except ImportError as exc: + if exc.name != '_frozen_importlib': + raise + _frozen_importlib = None +try: + import _frozen_importlib_external +except ImportError as exc: + _frozen_importlib_external = _bootstrap_external +import abc + + +def _register(abstract_cls, *classes): + for cls in classes: + abstract_cls.register(cls) + if _frozen_importlib is not None: + try: + frozen_cls = getattr(_frozen_importlib, cls.__name__) + except AttributeError: + frozen_cls = getattr(_frozen_importlib_external, cls.__name__) + abstract_cls.register(frozen_cls) + + +class Finder(metaclass=abc.ABCMeta): + + """Legacy abstract base class for import finders. + + It may be subclassed for compatibility with legacy third party + reimplementations of the import system. Otherwise, finder + implementations should derive from the more specific MetaPathFinder + or PathEntryFinder ABCs. + """ + + @abc.abstractmethod + def find_module(self, fullname, path=None): + """An abstract method that should find a module. + The fullname is a str and the optional path is a str or None. + Returns a Loader object or None. + """ + + +class MetaPathFinder(Finder): + + """Abstract base class for import finders on sys.meta_path.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_module(self, fullname, path): + """Return a loader for the module. + + If no module is found, return None. The fullname is a str and + the path is a list of strings or None. + + This method is deprecated in favor of finder.find_spec(). If find_spec() + exists then backwards-compatible functionality is provided for this + method. + + """ + if not hasattr(self, 'find_spec'): + return None + found = self.find_spec(fullname, path) + return found.loader if found is not None else None + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by importlib.invalidate_caches(). + """ + +_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter, + machinery.PathFinder, machinery.WindowsRegistryFinder) + + +class PathEntryFinder(Finder): + + """Abstract base class for path entry finders used by PathFinder.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_loader(self, fullname): + """Return (loader, namespace portion) for the path entry. + + The fullname is a str. The namespace portion is a sequence of + path entries contributing to part of a namespace package. The + sequence may be empty. If loader is not None, the portion will + be ignored. + + The portion will be discarded if another path entry finder + locates the module as a normal module or package. + + This method is deprecated in favor of finder.find_spec(). If find_spec() + is provided than backwards-compatible functionality is provided. + + """ + if not hasattr(self, 'find_spec'): + return None, [] + found = self.find_spec(fullname) + if found is not None: + if not found.submodule_search_locations: + portions = [] + else: + portions = found.submodule_search_locations + return found.loader, portions + else: + return None, [] + + find_module = _bootstrap_external._find_module_shim + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by PathFinder.invalidate_caches(). + """ + +_register(PathEntryFinder, machinery.FileFinder) + + +class Loader(metaclass=abc.ABCMeta): + + """Abstract base class for import loaders.""" + + def create_module(self, spec): + """Return a module to initialize and into which to load. + + This method should raise ImportError if anything prevents it + from creating a new module. It may return None to indicate + that the spec should create the new module. + """ + # By default, defer to default semantics for the new module. + return None + + # We don't define exec_module() here since that would break + # hasattr checks we do to support backward compatibility. + + def load_module(self, fullname): + """Return the loaded module. + + The module must be added to sys.modules and have import-related + attributes set properly. The fullname is a str. + + ImportError is raised on failure. + + This method is deprecated in favor of loader.exec_module(). If + exec_module() exists then it is used to provide a backwards-compatible + functionality for this method. + + """ + if not hasattr(self, 'exec_module'): + raise ImportError + return _bootstrap._load_module_shim(self, fullname) + + def module_repr(self, module): + """Return a module's repr. + + Used by the module type when the method does not raise + NotImplementedError. + + This method is deprecated. + + """ + # The exception will cause ModuleType.__repr__ to ignore this method. + raise NotImplementedError + + +class ResourceLoader(Loader): + + """Abstract base class for loaders which can return data from their + back-end storage. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + @abc.abstractmethod + def get_data(self, path): + """Abstract method which when implemented should return the bytes for + the specified path. The path must be a str.""" + raise IOError + + +class InspectLoader(Loader): + + """Abstract base class for loaders which support inspection about the + modules they can load. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + def is_package(self, fullname): + """Optional method which when implemented should return whether the + module is a package. The fullname is a str. Returns a bool. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method which returns the code object for the module. + + The fullname is a str. Returns a types.CodeType if possible, else + returns None if a code object does not make sense + (e.g. built-in module). Raises ImportError if the module cannot be + found. + """ + source = self.get_source(fullname) + if source is None: + return None + return self.source_to_code(source) + + @abc.abstractmethod + def get_source(self, fullname): + """Abstract method which should return the source code for the + module. The fullname is a str. Returns a str. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + @staticmethod + def source_to_code(data, path=''): + """Compile 'data' into a code object. + + The 'data' argument can be anything that compile() can handle. The'path' + argument should be where the data was retrieved (when applicable).""" + return compile(data, path, 'exec', dont_inherit=True) + + exec_module = _bootstrap_external._LoaderBasics.exec_module + load_module = _bootstrap_external._LoaderBasics.load_module + +_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter) + + +class ExecutionLoader(InspectLoader): + + """Abstract base class for loaders that wish to support the execution of + modules as scripts. + + This ABC represents one of the optional protocols specified in PEP 302. + + """ + + @abc.abstractmethod + def get_filename(self, fullname): + """Abstract method which should return the value that __file__ is to be + set to. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method to return the code object for fullname. + + Should return None if not applicable (e.g. built-in module). + Raise ImportError if the module cannot be found. + """ + source = self.get_source(fullname) + if source is None: + return None + try: + path = self.get_filename(fullname) + except ImportError: + return self.source_to_code(source) + else: + return self.source_to_code(source, path) + +_register(ExecutionLoader, machinery.ExtensionFileLoader) + + +class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class partially implementing the ResourceLoader and + ExecutionLoader ABCs.""" + +_register(FileLoader, machinery.SourceFileLoader, + machinery.SourcelessFileLoader) + + +class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class for loading source code (and optionally any + corresponding bytecode). + + To support loading from source code, the abstractmethods inherited from + ResourceLoader and ExecutionLoader need to be implemented. To also support + loading from bytecode, the optional methods specified directly by this ABC + is required. + + Inherited abstractmethods not implemented in this ABC: + + * ResourceLoader.get_data + * ExecutionLoader.get_filename + + """ + + def path_mtime(self, path): + """Return the (int) modification time for the path (str).""" + if self.path_stats.__func__ is SourceLoader.path_stats: + raise IOError + return int(self.path_stats(path)['mtime']) + + def path_stats(self, path): + """Return a metadata dict for the source pointed to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + """ + if self.path_mtime.__func__ is SourceLoader.path_mtime: + raise IOError + return {'mtime': self.path_mtime(path)} + + def set_data(self, path, data): + """Write the bytes to the path (if possible). + + Accepts a str path and data as bytes. + + Any needed intermediary directories are to be created. If for some + reason the file cannot be written because of permissions, fail + silently. + """ + +_register(SourceLoader, machinery.SourceFileLoader) diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/machinery.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/machinery.py new file mode 100644 index 0000000..1b2b5c9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/machinery.py @@ -0,0 +1,21 @@ +"""The machinery of importlib: finders, loaders, hooks, etc.""" + +import _imp + +from ._bootstrap import ModuleSpec +from ._bootstrap import BuiltinImporter +from ._bootstrap import FrozenImporter +from ._bootstrap_external import (SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES, + OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, + EXTENSION_SUFFIXES) +from ._bootstrap_external import WindowsRegistryFinder +from ._bootstrap_external import PathFinder +from ._bootstrap_external import FileFinder +from ._bootstrap_external import SourceFileLoader +from ._bootstrap_external import SourcelessFileLoader +from ._bootstrap_external import ExtensionFileLoader + + +def all_suffixes(): + """Returns a list of all recognized module suffixes for this process""" + return SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES diff --git a/flaskwebproject/FlaskWebProject1/Lib/importlib/util.py b/flaskwebproject/FlaskWebProject1/Lib/importlib/util.py new file mode 100644 index 0000000..6bdf0d4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/importlib/util.py @@ -0,0 +1,288 @@ +"""Utility code for constructing importers, etc.""" +from . import abc +from ._bootstrap import module_from_spec +from ._bootstrap import _resolve_name +from ._bootstrap import spec_from_loader +from ._bootstrap import _find_spec +from ._bootstrap_external import MAGIC_NUMBER +from ._bootstrap_external import cache_from_source +from ._bootstrap_external import decode_source +from ._bootstrap_external import source_from_cache +from ._bootstrap_external import spec_from_file_location + +from contextlib import contextmanager +import functools +import sys +import types +import warnings + + +def resolve_name(name, package): + """Resolve a relative module name to an absolute one.""" + if not name.startswith('.'): + return name + elif not package: + raise ValueError(f'no package specified for {repr(name)} ' + '(required for relative module names)') + level = 0 + for character in name: + if character != '.': + break + level += 1 + return _resolve_name(name[level:], package, level) + + +def _find_spec_from_path(name, path=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + Dotted names do not have their parent packages implicitly imported. You will + most likely need to explicitly import all parent packages in the proper + order for a submodule to get the correct spec. + + """ + if name not in sys.modules: + return _find_spec(name, path) + else: + module = sys.modules[name] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +def find_spec(name, package=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + If the name is for submodule (contains a dot), the parent module is + automatically imported. + + The name and package arguments work the same as importlib.import_module(). + In other words, relative module names (with leading dots) work. + + """ + fullname = resolve_name(name, package) if name.startswith('.') else name + if fullname not in sys.modules: + parent_name = fullname.rpartition('.')[0] + if parent_name: + # Use builtins.__import__() in case someone replaced it. + parent = __import__(parent_name, fromlist=['__path__']) + return _find_spec(fullname, parent.__path__) + else: + return _find_spec(fullname, None) + else: + module = sys.modules[fullname] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +@contextmanager +def _module_to_load(name): + is_reload = name in sys.modules + + module = sys.modules.get(name) + if not is_reload: + # This must be done before open() is called as the 'io' module + # implicitly imports 'locale' and would otherwise trigger an + # infinite loop. + module = type(sys)(name) + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes wrong) + module.__initializing__ = True + sys.modules[name] = module + try: + yield module + except Exception: + if not is_reload: + try: + del sys.modules[name] + except KeyError: + pass + finally: + module.__initializing__ = False + + +def set_package(fxn): + """Set __package__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_package_wrapper(*args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(*args, **kwargs) + if getattr(module, '__package__', None) is None: + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = module.__package__.rpartition('.')[0] + return module + return set_package_wrapper + + +def set_loader(fxn): + """Set __loader__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_loader_wrapper(self, *args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(self, *args, **kwargs) + if getattr(module, '__loader__', None) is None: + module.__loader__ = self + return module + return set_loader_wrapper + + +def module_for_loader(fxn): + """Decorator to handle selecting the proper module for loaders. + + The decorated function is passed the module to use instead of the module + name. The module passed in to the function is either from sys.modules if + it already exists or is a new module. If the module is new, then __name__ + is set the first argument to the method, __loader__ is set to self, and + __package__ is set accordingly (if self.is_package() is defined) will be set + before it is passed to the decorated function (if self.is_package() does + not work for the module it will be set post-load). + + If an exception is raised and the decorator created the module it is + subsequently removed from sys.modules. + + The decorator assumes that the decorated function takes the module name as + the second argument. + + """ + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + @functools.wraps(fxn) + def module_for_loader_wrapper(self, fullname, *args, **kwargs): + with _module_to_load(fullname) as module: + module.__loader__ = self + try: + is_package = self.is_package(fullname) + except (ImportError, AttributeError): + pass + else: + if is_package: + module.__package__ = fullname + else: + module.__package__ = fullname.rpartition('.')[0] + # If __package__ was not set above, __import__() will do it later. + return fxn(self, module, *args, **kwargs) + + return module_for_loader_wrapper + + +class _LazyModule(types.ModuleType): + + """A subclass of the module type which triggers loading upon attribute access.""" + + def __getattribute__(self, attr): + """Trigger the load of the module and return the attribute.""" + # All module metadata must be garnered from __spec__ in order to avoid + # using mutated values. + # Stop triggering this method. + self.__class__ = types.ModuleType + # Get the original name to make sure no object substitution occurred + # in sys.modules. + original_name = self.__spec__.name + # Figure out exactly what attributes were mutated between the creation + # of the module and now. + attrs_then = self.__spec__.loader_state['__dict__'] + original_type = self.__spec__.loader_state['__class__'] + attrs_now = self.__dict__ + attrs_updated = {} + for key, value in attrs_now.items(): + # Code that set the attribute may have kept a reference to the + # assigned object, making identity more important than equality. + if key not in attrs_then: + attrs_updated[key] = value + elif id(attrs_now[key]) != id(attrs_then[key]): + attrs_updated[key] = value + self.__spec__.loader.exec_module(self) + # If exec_module() was used directly there is no guarantee the module + # object was put into sys.modules. + if original_name in sys.modules: + if id(self) != id(sys.modules[original_name]): + raise ValueError(f"module object for {original_name!r} " + "substituted in sys.modules during a lazy " + "load") + # Update after loading since that's what would happen in an eager + # loading situation. + self.__dict__.update(attrs_updated) + return getattr(self, attr) + + def __delattr__(self, attr): + """Trigger the load and then perform the deletion.""" + # To trigger the load and raise an exception if the attribute + # doesn't exist. + self.__getattribute__(attr) + delattr(self, attr) + + +class LazyLoader(abc.Loader): + + """A loader that creates a module which defers loading until attribute access.""" + + @staticmethod + def __check_eager_loader(loader): + if not hasattr(loader, 'exec_module'): + raise TypeError('loader must define exec_module()') + + @classmethod + def factory(cls, loader): + """Construct a callable which returns the eager loader made lazy.""" + cls.__check_eager_loader(loader) + return lambda *args, **kwargs: cls(loader(*args, **kwargs)) + + def __init__(self, loader): + self.__check_eager_loader(loader) + self.loader = loader + + def create_module(self, spec): + return self.loader.create_module(spec) + + def exec_module(self, module): + """Make the module load lazily.""" + module.__spec__.loader = self.loader + module.__loader__ = self.loader + # Don't need to worry about deep-copying as trying to set an attribute + # on an object would have triggered the load, + # e.g. ``module.__spec__.loader = None`` would trigger a load from + # trying to access module.__spec__. + loader_state = {} + loader_state['__dict__'] = module.__dict__.copy() + loader_state['__class__'] = module.__class__ + module.__spec__.loader_state = loader_state + module.__class__ = _LazyModule diff --git a/flaskwebproject/FlaskWebProject1/Lib/io.py b/flaskwebproject/FlaskWebProject1/Lib/io.py new file mode 100644 index 0000000..968ee50 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/io.py @@ -0,0 +1,99 @@ +"""The io module provides the Python interfaces to stream handling. The +builtin open function is defined in this module. + +At the top of the I/O hierarchy is the abstract base class IOBase. It +defines the basic interface to a stream. Note, however, that there is no +separation between reading and writing to streams; implementations are +allowed to raise an OSError if they do not support a given operation. + +Extending IOBase is RawIOBase which deals simply with the reading and +writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide +an interface to OS files. + +BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its +subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer +streams that are readable, writable, and both respectively. +BufferedRandom provides a buffered interface to random access +streams. BytesIO is a simple stream of in-memory bytes. + +Another IOBase subclass, TextIOBase, deals with the encoding and decoding +of streams into text. TextIOWrapper, which extends it, is a buffered text +interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO +is an in-memory stream for text. + +Argument names are not part of the specification, and only the arguments +of open() are intended to be used as keyword arguments. + +data: + +DEFAULT_BUFFER_SIZE + + An int containing the default buffer size used by the module's buffered + I/O classes. open() uses the file's blksize (as obtained by os.stat) if + possible. +""" +# New I/O library conforming to PEP 3116. + +__author__ = ("Guido van Rossum , " + "Mike Verdone , " + "Mark Russell , " + "Antoine Pitrou , " + "Amaury Forgeot d'Arc , " + "Benjamin Peterson ") + +__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", + "BytesIO", "StringIO", "BufferedIOBase", + "BufferedReader", "BufferedWriter", "BufferedRWPair", + "BufferedRandom", "TextIOBase", "TextIOWrapper", + "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] + + +import _io +import abc + +from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation, + open, FileIO, BytesIO, StringIO, BufferedReader, + BufferedWriter, BufferedRWPair, BufferedRandom, + IncrementalNewlineDecoder, TextIOWrapper) + +OpenWrapper = _io.open # for compatibility with _pyio + +# Pretend this exception was created here. +UnsupportedOperation.__module__ = "io" + +# for seek() +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Declaring ABCs in C is tricky so we do it here. +# Method descriptions and default implementations are inherited from the C +# version however. +class IOBase(_io._IOBase, metaclass=abc.ABCMeta): + __doc__ = _io._IOBase.__doc__ + +class RawIOBase(_io._RawIOBase, IOBase): + __doc__ = _io._RawIOBase.__doc__ + +class BufferedIOBase(_io._BufferedIOBase, IOBase): + __doc__ = _io._BufferedIOBase.__doc__ + +class TextIOBase(_io._TextIOBase, IOBase): + __doc__ = _io._TextIOBase.__doc__ + +RawIOBase.register(FileIO) + +for klass in (BytesIO, BufferedReader, BufferedWriter, BufferedRandom, + BufferedRWPair): + BufferedIOBase.register(klass) + +for klass in (StringIO, TextIOWrapper): + TextIOBase.register(klass) +del klass + +try: + from _io import _WindowsConsoleIO +except ImportError: + pass +else: + RawIOBase.register(_WindowsConsoleIO) diff --git a/flaskwebproject/FlaskWebProject1/Lib/keyword.py b/flaskwebproject/FlaskWebProject1/Lib/keyword.py new file mode 100644 index 0000000..6e1e882 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/keyword.py @@ -0,0 +1,94 @@ +#! /usr/bin/env python3 + +"""Keywords (from "graminit.c") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree after building the interpreter and run: + + ./python Lib/keyword.py +""" + +__all__ = ["iskeyword", "kwlist"] + +kwlist = [ +#--start keywords-- + 'False', + 'None', + 'True', + 'and', + 'as', + 'assert', + 'break', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'nonlocal', + 'not', + 'or', + 'pass', + 'raise', + 'return', + 'try', + 'while', + 'with', + 'yield', +#--end keywords-- + ] + +iskeyword = frozenset(kwlist).__contains__ + +def main(): + import sys, re + + args = sys.argv[1:] + iptfile = args and args[0] or "Python/graminit.c" + if len(args) > 1: optfile = args[1] + else: optfile = "Lib/keyword.py" + + # load the output skeleton from the target, taking care to preserve its + # newline convention. + with open(optfile, newline='') as fp: + format = fp.readlines() + nl = format[0][len(format[0].strip()):] if format else '\n' + + # scan the source file for keywords + with open(iptfile) as fp: + strprog = re.compile('"([^"]+)"') + lines = [] + for line in fp: + if '{1, "' in line: + match = strprog.search(line) + if match: + lines.append(" '" + match.group(1) + "'," + nl) + lines.sort() + + # insert the lines of keywords into the skeleton + try: + start = format.index("#--start keywords--" + nl) + 1 + end = format.index("#--end keywords--" + nl) + format[start:end] = lines + except ValueError: + sys.stderr.write("target does not contain format markers\n") + sys.exit(1) + + # write the output file + with open(optfile, 'w', newline='') as fp: + fp.writelines(format) + +if __name__ == "__main__": + main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/linecache.py b/flaskwebproject/FlaskWebProject1/Lib/linecache.py new file mode 100644 index 0000000..3afcce1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/linecache.py @@ -0,0 +1,177 @@ +"""Cache lines from Python source files. + +This is intended to read lines from modules imported -- hence if a filename +is not found, it will look down the module search path for a file by +that name. +""" + +import functools +import sys +import os +import tokenize + +__all__ = ["getline", "clearcache", "checkcache"] + +def getline(filename, lineno, module_globals=None): + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno-1] + else: + return '' + + +# The cache + +# The cache. Maps filenames to either a thunk which will provide source code, +# or a tuple (size, mtime, lines, fullname) once loaded. +cache = {} + + +def clearcache(): + """Clear the cache entirely.""" + + global cache + cache = {} + + +def getlines(filename, module_globals=None): + """Get the lines for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + if filename in cache: + entry = cache[filename] + if len(entry) != 1: + return cache[filename][2] + + try: + return updatecache(filename, module_globals) + except MemoryError: + clearcache() + return [] + + +def checkcache(filename=None): + """Discard cache entries that are out of date. + (This is not checked upon each call!)""" + + if filename is None: + filenames = list(cache.keys()) + else: + if filename in cache: + filenames = [filename] + else: + return + + for filename in filenames: + entry = cache[filename] + if len(entry) == 1: + # lazy cache entry, leave it lazy. + continue + size, mtime, lines, fullname = entry + if mtime is None: + continue # no-op for files loaded via a __loader__ + try: + stat = os.stat(fullname) + except OSError: + del cache[filename] + continue + if size != stat.st_size or mtime != stat.st_mtime: + del cache[filename] + + +def updatecache(filename, module_globals=None): + """Update a cache entry and return its list of lines. + If something's wrong, print a message, discard the cache entry, + and return an empty list.""" + + if filename in cache: + if len(cache[filename]) != 1: + del cache[filename] + if not filename or (filename.startswith('<') and filename.endswith('>')): + return [] + + fullname = filename + try: + stat = os.stat(fullname) + except OSError: + basename = filename + + # Realise a lazy loader based lookup if there is one + # otherwise try to lookup right now. + if lazycache(filename, module_globals): + try: + data = cache[filename][0]() + except (ImportError, OSError): + pass + else: + if data is None: + # No luck, the PEP302 loader cannot find the source + # for this module. + return [] + cache[filename] = ( + len(data), None, + [line+'\n' for line in data.splitlines()], fullname + ) + return cache[filename][2] + + # Try looking through the module search path, which is only useful + # when handling a relative filename. + if os.path.isabs(filename): + return [] + + for dirname in sys.path: + try: + fullname = os.path.join(dirname, basename) + except (TypeError, AttributeError): + # Not sufficiently string-like to do anything useful with. + continue + try: + stat = os.stat(fullname) + break + except OSError: + pass + else: + return [] + try: + with tokenize.open(fullname) as fp: + lines = fp.readlines() + except OSError: + return [] + if lines and not lines[-1].endswith('\n'): + lines[-1] += '\n' + size, mtime = stat.st_size, stat.st_mtime + cache[filename] = size, mtime, lines, fullname + return lines + + +def lazycache(filename, module_globals): + """Seed the cache for filename with module_globals. + + The module loader will be asked for the source only when getlines is + called, not immediately. + + If there is an entry in the cache already, it is not altered. + + :return: True if a lazy load is registered in the cache, + otherwise False. To register such a load a module loader with a + get_source method must be found, the filename must be a cachable + filename, and the filename must not be already cached. + """ + if filename in cache: + if len(cache[filename]) == 1: + return True + else: + return False + if not filename or (filename.startswith('<') and filename.endswith('>')): + return False + # Try for a __loader__, if available + if module_globals and '__loader__' in module_globals: + name = module_globals.get('__name__') + loader = module_globals['__loader__'] + get_source = getattr(loader, 'get_source', None) + + if name and get_source: + get_lines = functools.partial(get_source, name) + cache[filename] = (get_lines,) + return True + return False diff --git a/flaskwebproject/FlaskWebProject1/Lib/no-global-site-packages.txt b/flaskwebproject/FlaskWebProject1/Lib/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/ntpath.py b/flaskwebproject/FlaskWebProject1/Lib/ntpath.py new file mode 100644 index 0000000..a5e79ba --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/ntpath.py @@ -0,0 +1,693 @@ +# Module 'ntpath' -- common operations on WinNT/Win95 pathnames +"""Common pathname manipulations, WindowsNT/95 version. + +Instead of importing this module directly, import os and refer to this +module as os.path. +""" + +# strings representing various path-related bits and pieces +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '\\' +pathsep = ';' +altsep = '/' +defpath = '.;C:\\bin' +devnull = 'nul' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime", "islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", + "extsep","devnull","realpath","supports_unicode_filenames","relpath", + "samefile", "sameopenfile", "samestat", "commonpath"] + +def _get_bothseps(path): + if isinstance(path, bytes): + return b'\\/' + else: + return '\\/' + +# Normalize the case of a pathname and map slashes to backslashes. +# Other normalizations (such as optimizing '../' away) are not done +# (this is done by normpath). + +def normcase(s): + """Normalize case of pathname. + + Makes all characters lowercase and all slashes into backslashes.""" + s = os.fspath(s) + try: + if isinstance(s, bytes): + return s.replace(b'/', b'\\').lower() + else: + return s.replace('/', '\\').lower() + except (TypeError, AttributeError): + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not %r" % s.__class__.__name__) from None + raise + + +# Return whether a path is absolute. +# Trivial in Posix, harder on Windows. +# For Windows it is absolute if it starts with a slash or backslash (current +# volume), or if a pathname after the volume-letter-and-colon or UNC-resource +# starts with a slash or backslash. + +def isabs(s): + """Test whether a path is absolute""" + s = os.fspath(s) + s = splitdrive(s)[1] + return len(s) > 0 and s[0] in _get_bothseps(s) + + +# Join two (or more) paths. +def join(path, *paths): + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + seps = b'\\/' + colon = b':' + else: + sep = '\\' + seps = '\\/' + colon = ':' + try: + if not paths: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + result_drive, result_path = splitdrive(path) + for p in map(os.fspath, paths): + p_drive, p_path = splitdrive(p) + if p_path and p_path[0] in seps: + # Second path is absolute + if p_drive or not result_drive: + result_drive = p_drive + result_path = p_path + continue + elif p_drive and p_drive != result_drive: + if p_drive.lower() != result_drive.lower(): + # Different drives => ignore the first path entirely + result_drive = p_drive + result_path = p_path + continue + # Same drive in different case + result_drive = p_drive + # Second path is relative to the first + if result_path and result_path[-1] not in seps: + result_path = result_path + sep + result_path = result_path + p_path + ## add separator between UNC and non-absolute path + if (result_path and result_path[0] not in seps and + result_drive and result_drive[-1:] != colon): + return result_drive + sep + result_path + return result_drive + result_path + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', path, *paths) + raise + + +# Split a path in a drive specification (a drive letter followed by a +# colon) and the path specification. +# It is always true that drivespec + pathspec == p +def splitdrive(p): + """Split a pathname into drive/UNC sharepoint and relative path specifiers. + Returns a 2-tuple (drive_or_unc, path); either part may be empty. + + If you assign + result = splitdrive(p) + It is always true that: + result[0] + result[1] == p + + If the path contained a drive letter, drive_or_unc will contain everything + up to and including the colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir") + + If the path contained a UNC path, the drive_or_unc will contain the host name + and share up to but not including the fourth directory separator character. + e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir") + + Paths cannot contain both a drive letter and a UNC path. + + """ + p = os.fspath(p) + if len(p) >= 2: + if isinstance(p, bytes): + sep = b'\\' + altsep = b'/' + colon = b':' + else: + sep = '\\' + altsep = '/' + colon = ':' + normp = p.replace(altsep, sep) + if (normp[0:2] == sep*2) and (normp[2:3] != sep): + # is a UNC path: + # vvvvvvvvvvvvvvvvvvvv drive letter or UNC path + # \\machine\mountpoint\directory\etc\... + # directory ^^^^^^^^^^^^^^^ + index = normp.find(sep, 2) + if index == -1: + return p[:0], p + index2 = normp.find(sep, index + 1) + # a UNC path can't have two slashes in a row + # (after the initial two) + if index2 == index + 1: + return p[:0], p + if index2 == -1: + index2 = len(p) + return p[:index2], p[index2:] + if normp[1:2] == colon: + return p[:2], p[2:] + return p[:0], p + + +# Parse UNC paths +def splitunc(p): + """Deprecated since Python 3.1. Please use splitdrive() instead; + it now handles UNC paths. + + Split a pathname into UNC mount point and relative path specifiers. + + Return a 2-tuple (unc, rest); either part may be empty. + If unc is not empty, it has the form '//host/mount' (or similar + using backslashes). unc+rest is always the input path. + Paths containing drive letters never have a UNC part. + """ + import warnings + warnings.warn("ntpath.splitunc is deprecated, use ntpath.splitdrive instead", + DeprecationWarning, 2) + drive, path = splitdrive(p) + if len(drive) == 2: + # Drive letter present + return p[:0], p + return drive, path + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). After the trailing '/' is stripped, the invariant +# join(head, tail) == p holds. +# The resulting head won't end in '/' unless it is the root. + +def split(p): + """Split a pathname. + + Return tuple (head, tail) where tail is everything after the final slash. + Either part may be empty.""" + p = os.fspath(p) + seps = _get_bothseps(p) + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in seps: + i -= 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head = head.rstrip(seps) or head + return d + head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + p = os.fspath(p) + if isinstance(p, bytes): + return genericpath._splitext(p, b'\\', b'/', b'.') + else: + return genericpath._splitext(p, '\\', '/', '.') +splitext.__doc__ = genericpath._splitext.__doc__ + + +# Return the tail (basename) part of a path. + +def basename(p): + """Returns the final component of a pathname""" + return split(p)[1] + + +# Return the head (dirname) part of a path. + +def dirname(p): + """Returns the directory component of a pathname""" + return split(p)[0] + +# Is a path a symbolic link? +# This will always return false on systems where os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link. + This will always return false for Windows prior to 6.0. + """ + try: + st = os.lstat(path) + except (OSError, AttributeError): + return False + return stat.S_ISLNK(st.st_mode) + +# Being true for dangling symbolic links is also useful. + +def lexists(path): + """Test whether a path exists. Returns True for broken symbolic links""" + try: + st = os.lstat(path) + except OSError: + return False + return True + +# Is a path a mount point? +# Any drive letter root (eg c:\) +# Any share UNC (eg \\server\share) +# Any volume mounted on a filesystem folder +# +# No one method detects all three situations. Historically we've lexically +# detected drive letter roots and share UNCs. The canonical approach to +# detecting mounted volumes (querying the reparse tag) fails for the most +# common case: drive letter roots. The alternative which uses GetVolumePathName +# fails if the drive letter is the result of a SUBST. +try: + from nt import _getvolumepathname +except ImportError: + _getvolumepathname = None +def ismount(path): + """Test whether a path is a mount point (a drive root, the root of a + share, or a mounted volume)""" + path = os.fspath(path) + seps = _get_bothseps(path) + path = abspath(path) + root, rest = splitdrive(path) + if root and root[0] in seps: + return (not rest) or (rest in seps) + if rest in seps: + return True + + if _getvolumepathname: + return path.rstrip(seps) == _getvolumepathname(path).rstrip(seps) + else: + return False + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructs. + + If user or $HOME is unknown, do nothing.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + i, n = 1, len(path) + while i < n and path[i] not in _get_bothseps(path): + i += 1 + + if 'HOME' in os.environ: + userhome = os.environ['HOME'] + elif 'USERPROFILE' in os.environ: + userhome = os.environ['USERPROFILE'] + elif not 'HOMEPATH' in os.environ: + return path + else: + try: + drive = os.environ['HOMEDRIVE'] + except KeyError: + drive = '' + userhome = join(drive, os.environ['HOMEPATH']) + + if isinstance(path, bytes): + userhome = os.fsencode(userhome) + + if i != 1: #~user + userhome = join(dirname(userhome), path[1:i]) + + return userhome + path[i:] + + +# Expand paths containing shell variable substitutions. +# The following rules apply: +# - no expansion within single quotes +# - '$$' is translated into '$' +# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2% +# - ${varname} is accepted. +# - $varname is accepted. +# - %varname% is accepted. +# - varnames can be made out of letters, digits and the characters '_-' +# (though is not verified in the ${varname} and %varname% cases) +# XXX With COMMAND.COM you can use any characters in a variable name, +# XXX except '^|<>='. + +def expandvars(path): + """Expand shell variables of the forms $var, ${var} and %var%. + + Unknown variables are left unchanged.""" + path = os.fspath(path) + if isinstance(path, bytes): + if b'$' not in path and b'%' not in path: + return path + import string + varchars = bytes(string.ascii_letters + string.digits + '_-', 'ascii') + quote = b'\'' + percent = b'%' + brace = b'{' + rbrace = b'}' + dollar = b'$' + environ = getattr(os, 'environb', None) + else: + if '$' not in path and '%' not in path: + return path + import string + varchars = string.ascii_letters + string.digits + '_-' + quote = '\'' + percent = '%' + brace = '{' + rbrace = '}' + dollar = '$' + environ = os.environ + res = path[:0] + index = 0 + pathlen = len(path) + while index < pathlen: + c = path[index:index+1] + if c == quote: # no expansion within single quotes + path = path[index + 1:] + pathlen = len(path) + try: + index = path.index(c) + res += c + path[:index + 1] + except ValueError: + res += c + path + index = pathlen - 1 + elif c == percent: # variable or '%' + if path[index + 1:index + 2] == percent: + res += c + index += 1 + else: + path = path[index+1:] + pathlen = len(path) + try: + index = path.index(percent) + except ValueError: + res += percent + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = percent + var + percent + res += value + elif c == dollar: # variable or '$$' + if path[index + 1:index + 2] == dollar: + res += c + index += 1 + elif path[index + 1:index + 2] == brace: + path = path[index+2:] + pathlen = len(path) + try: + index = path.index(rbrace) + except ValueError: + res += dollar + brace + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + brace + var + rbrace + res += value + else: + var = path[:0] + index += 1 + c = path[index:index + 1] + while c and c in varchars: + var += c + index += 1 + c = path[index:index + 1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + var + res += value + if c: + index -= 1 + else: + res += c + index += 1 + return res + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B. +# Previously, this function also truncated pathnames to 8+3 format, +# but as this module is called "ntpath", that's obviously wrong! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + pardir = b'..' + special_prefixes = (b'\\\\.\\', b'\\\\?\\') + else: + sep = '\\' + altsep = '/' + curdir = '.' + pardir = '..' + special_prefixes = ('\\\\.\\', '\\\\?\\') + if path.startswith(special_prefixes): + # in the case of paths with these prefixes: + # \\.\ -> device names + # \\?\ -> literal paths + # do not do any normalization, but return the path unchanged + return path + path = path.replace(altsep, sep) + prefix, path = splitdrive(path) + + # collapse initial backslashes + if path.startswith(sep): + prefix += sep + path = path.lstrip(sep) + + comps = path.split(sep) + i = 0 + while i < len(comps): + if not comps[i] or comps[i] == curdir: + del comps[i] + elif comps[i] == pardir: + if i > 0 and comps[i-1] != pardir: + del comps[i-1:i+1] + i -= 1 + elif i == 0 and prefix.endswith(sep): + del comps[i] + else: + i += 1 + else: + i += 1 + # If the path is now empty, substitute '.' + if not prefix and not comps: + comps.append(curdir) + return prefix + sep.join(comps) + + +# Return an absolute path. +try: + from nt import _getfullpathname + +except ImportError: # not running on Windows - mock up something sensible + def abspath(path): + """Return the absolute version of a path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + +else: # use native Windows method on Windows + def abspath(path): + """Return the absolute version of a path.""" + + if path: # Empty path must return current working directory. + path = os.fspath(path) + try: + path = _getfullpathname(path) + except OSError: + pass # Bad path - return unchanged. + elif isinstance(path, bytes): + path = os.getcwdb() + else: + path = os.getcwd() + return normpath(path) + +# realpath is a no-op on systems without islink support +realpath = abspath +# Win9x family and earlier have no Unicode filename support. +supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and + sys.getwindowsversion()[3] >= 2) + +def relpath(path, start=None): + """Return a relative version of a path""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + curdir = b'.' + pardir = b'..' + else: + sep = '\\' + curdir = '.' + pardir = '..' + + if start is None: + start = curdir + + if not path: + raise ValueError("no path specified") + + start = os.fspath(start) + try: + start_abs = abspath(normpath(start)) + path_abs = abspath(normpath(path)) + start_drive, start_rest = splitdrive(start_abs) + path_drive, path_rest = splitdrive(path_abs) + if normcase(start_drive) != normcase(path_drive): + raise ValueError("path is on mount %r, start on mount %r" % ( + path_drive, start_drive)) + + start_list = [x for x in start_rest.split(sep) if x] + path_list = [x for x in path_rest.split(sep) if x] + # Work out how much of the filepath is shared by start and path. + i = 0 + for e1, e2 in zip(start_list, path_list): + if normcase(e1) != normcase(e2): + break + i += 1 + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + except (TypeError, ValueError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The function is case-insensitive and 'separator-insensitive', i.e. if the +# only difference between two paths is the use of '\' versus '/' as separator, +# they are deemed to be equal. +# +# However, the returned path will have the standard '\' separator (even if the +# given paths had the alternative '/' separator) and will have the case of the +# first path given in the sequence. Additionally, any trailing separator is +# stripped from the returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + else: + sep = '\\' + altsep = '/' + curdir = '.' + + try: + drivesplits = [splitdrive(p.replace(altsep, sep).lower()) for p in paths] + split_paths = [p.split(sep) for d, p in drivesplits] + + try: + isabs, = set(p[:1] == sep for d, p in drivesplits) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + # Check that all drive letters or UNC paths match. The check is made only + # now otherwise type errors for mixing strings and bytes would not be + # caught. + if len(set(d for d, p in drivesplits)) != 1: + raise ValueError("Paths don't have the same drive") + + drive, path = splitdrive(paths[0].replace(altsep, sep)) + common = path.split(sep) + common = [c for c in common if c and c != curdir] + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + for i, c in enumerate(s1): + if c != s2[i]: + common = common[:i] + break + else: + common = common[:len(s1)] + + prefix = drive + sep if isabs else drive + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise + + +# determine if two files are in fact the same file +try: + # GetFinalPathNameByHandle is available starting with Windows 6.0. + # Windows XP and non-Windows OS'es will mock _getfinalpathname. + if sys.getwindowsversion()[:2] >= (6, 0): + from nt import _getfinalpathname + else: + raise ImportError +except (AttributeError, ImportError): + # On Windows XP and earlier, two files are the same if their absolute + # pathnames are the same. + # Non-Windows operating systems fake this method with an XP + # approximation. + def _getfinalpathname(f): + return normcase(abspath(f)) + + +try: + # The genericpath.isdir implementation uses os.stat and checks the mode + # attribute to tell whether or not the path is a directory. + # This is overkill on Windows - just pass the path to GetFileAttributes + # and check the attribute from there. + from nt import _isdir as isdir +except ImportError: + # Use genericpath.isdir as imported above. + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/operator.py b/flaskwebproject/FlaskWebProject1/Lib/operator.py new file mode 100644 index 0000000..0e2e53e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/operator.py @@ -0,0 +1,464 @@ +""" +Operator Interface + +This module exports a set of functions corresponding to the intrinsic +operators of Python. For example, operator.add(x, y) is equivalent +to the expression x+y. The function names are those used for special +methods; variants without leading and trailing '__' are also provided +for convenience. + +This is the pure Python implementation of the module. +""" + +__all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', + 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', + 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', + 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', + 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', + 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', + 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', + 'setitem', 'sub', 'truediv', 'truth', 'xor'] + +from builtins import abs as _abs + + +# Comparison Operations *******************************************************# + +def lt(a, b): + "Same as a < b." + return a < b + +def le(a, b): + "Same as a <= b." + return a <= b + +def eq(a, b): + "Same as a == b." + return a == b + +def ne(a, b): + "Same as a != b." + return a != b + +def ge(a, b): + "Same as a >= b." + return a >= b + +def gt(a, b): + "Same as a > b." + return a > b + +# Logical Operations **********************************************************# + +def not_(a): + "Same as not a." + return not a + +def truth(a): + "Return True if a is true, False otherwise." + return True if a else False + +def is_(a, b): + "Same as a is b." + return a is b + +def is_not(a, b): + "Same as a is not b." + return a is not b + +# Mathematical/Bitwise Operations *********************************************# + +def abs(a): + "Same as abs(a)." + return _abs(a) + +def add(a, b): + "Same as a + b." + return a + b + +def and_(a, b): + "Same as a & b." + return a & b + +def floordiv(a, b): + "Same as a // b." + return a // b + +def index(a): + "Same as a.__index__()." + return a.__index__() + +def inv(a): + "Same as ~a." + return ~a +invert = inv + +def lshift(a, b): + "Same as a << b." + return a << b + +def mod(a, b): + "Same as a % b." + return a % b + +def mul(a, b): + "Same as a * b." + return a * b + +def matmul(a, b): + "Same as a @ b." + return a @ b + +def neg(a): + "Same as -a." + return -a + +def or_(a, b): + "Same as a | b." + return a | b + +def pos(a): + "Same as +a." + return +a + +def pow(a, b): + "Same as a ** b." + return a ** b + +def rshift(a, b): + "Same as a >> b." + return a >> b + +def sub(a, b): + "Same as a - b." + return a - b + +def truediv(a, b): + "Same as a / b." + return a / b + +def xor(a, b): + "Same as a ^ b." + return a ^ b + +# Sequence Operations *********************************************************# + +def concat(a, b): + "Same as a + b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + return a + b + +def contains(a, b): + "Same as b in a (note reversed operands)." + return b in a + +def countOf(a, b): + "Return the number of times b occurs in a." + count = 0 + for i in a: + if i == b: + count += 1 + return count + +def delitem(a, b): + "Same as del a[b]." + del a[b] + +def getitem(a, b): + "Same as a[b]." + return a[b] + +def indexOf(a, b): + "Return the first index of b in a." + for i, j in enumerate(a): + if j == b: + return i + else: + raise ValueError('sequence.index(x): x not in sequence') + +def setitem(a, b, c): + "Same as a[b] = c." + a[b] = c + +def length_hint(obj, default=0): + """ + Return an estimate of the number of items in obj. + This is useful for presizing containers when building from an iterable. + + If the object supports len(), the result will be exact. Otherwise, it may + over- or under-estimate by an arbitrary amount. The result will be an + integer >= 0. + """ + if not isinstance(default, int): + msg = ("'%s' object cannot be interpreted as an integer" % + type(default).__name__) + raise TypeError(msg) + + try: + return len(obj) + except TypeError: + pass + + try: + hint = type(obj).__length_hint__ + except AttributeError: + return default + + try: + val = hint(obj) + except TypeError: + return default + if val is NotImplemented: + return default + if not isinstance(val, int): + msg = ('__length_hint__ must be integer, not %s' % + type(val).__name__) + raise TypeError(msg) + if val < 0: + msg = '__length_hint__() should return >= 0' + raise ValueError(msg) + return val + +# Generalized Lookup Objects **************************************************# + +class attrgetter: + """ + Return a callable object that fetches the given attribute(s) from its operand. + After f = attrgetter('name'), the call f(r) returns r.name. + After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date). + After h = attrgetter('name.first', 'name.last'), the call h(r) returns + (r.name.first, r.name.last). + """ + __slots__ = ('_attrs', '_call') + + def __init__(self, attr, *attrs): + if not attrs: + if not isinstance(attr, str): + raise TypeError('attribute name must be a string') + self._attrs = (attr,) + names = attr.split('.') + def func(obj): + for name in names: + obj = getattr(obj, name) + return obj + self._call = func + else: + self._attrs = (attr,) + attrs + getters = tuple(map(attrgetter, self._attrs)) + def func(obj): + return tuple(getter(obj) for getter in getters) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__qualname__, + ', '.join(map(repr, self._attrs))) + + def __reduce__(self): + return self.__class__, self._attrs + +class itemgetter: + """ + Return a callable object that fetches the given item(s) from its operand. + After f = itemgetter(2), the call f(r) returns r[2]. + After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]) + """ + __slots__ = ('_items', '_call') + + def __init__(self, item, *items): + if not items: + self._items = (item,) + def func(obj): + return obj[item] + self._call = func + else: + self._items = items = (item,) + items + def func(obj): + return tuple(obj[i] for i in items) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(map(repr, self._items))) + + def __reduce__(self): + return self.__class__, self._items + +class methodcaller: + """ + Return a callable object that calls the given method on its operand. + After f = methodcaller('name'), the call f(r) returns r.name(). + After g = methodcaller('name', 'date', foo=1), the call g(r) returns + r.name('date', foo=1). + """ + __slots__ = ('_name', '_args', '_kwargs') + + def __init__(*args, **kwargs): + if len(args) < 2: + msg = "methodcaller needs at least one argument, the method name" + raise TypeError(msg) + self = args[0] + self._name = args[1] + if not isinstance(self._name, str): + raise TypeError('method name must be a string') + self._args = args[2:] + self._kwargs = kwargs + + def __call__(self, obj): + return getattr(obj, self._name)(*self._args, **self._kwargs) + + def __repr__(self): + args = [repr(self._name)] + args.extend(map(repr, self._args)) + args.extend('%s=%r' % (k, v) for k, v in self._kwargs.items()) + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(args)) + + def __reduce__(self): + if not self._kwargs: + return self.__class__, (self._name,) + self._args + else: + from functools import partial + return partial(self.__class__, self._name, **self._kwargs), self._args + + +# In-place Operations *********************************************************# + +def iadd(a, b): + "Same as a += b." + a += b + return a + +def iand(a, b): + "Same as a &= b." + a &= b + return a + +def iconcat(a, b): + "Same as a += b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + a += b + return a + +def ifloordiv(a, b): + "Same as a //= b." + a //= b + return a + +def ilshift(a, b): + "Same as a <<= b." + a <<= b + return a + +def imod(a, b): + "Same as a %= b." + a %= b + return a + +def imul(a, b): + "Same as a *= b." + a *= b + return a + +def imatmul(a, b): + "Same as a @= b." + a @= b + return a + +def ior(a, b): + "Same as a |= b." + a |= b + return a + +def ipow(a, b): + "Same as a **= b." + a **=b + return a + +def irshift(a, b): + "Same as a >>= b." + a >>= b + return a + +def isub(a, b): + "Same as a -= b." + a -= b + return a + +def itruediv(a, b): + "Same as a /= b." + a /= b + return a + +def ixor(a, b): + "Same as a ^= b." + a ^= b + return a + + +try: + from _operator import * +except ImportError: + pass +else: + from _operator import __doc__ + +# All of these "__func__ = func" assignments have to happen after importing +# from _operator to make sure they're set to the right function +__lt__ = lt +__le__ = le +__eq__ = eq +__ne__ = ne +__ge__ = ge +__gt__ = gt +__not__ = not_ +__abs__ = abs +__add__ = add +__and__ = and_ +__floordiv__ = floordiv +__index__ = index +__inv__ = inv +__invert__ = invert +__lshift__ = lshift +__mod__ = mod +__mul__ = mul +__matmul__ = matmul +__neg__ = neg +__or__ = or_ +__pos__ = pos +__pow__ = pow +__rshift__ = rshift +__sub__ = sub +__truediv__ = truediv +__xor__ = xor +__concat__ = concat +__contains__ = contains +__delitem__ = delitem +__getitem__ = getitem +__setitem__ = setitem +__iadd__ = iadd +__iand__ = iand +__iconcat__ = iconcat +__ifloordiv__ = ifloordiv +__ilshift__ = ilshift +__imod__ = imod +__imul__ = imul +__imatmul__ = imatmul +__ior__ = ior +__ipow__ = ipow +__irshift__ = irshift +__isub__ = isub +__itruediv__ = itruediv +__ixor__ = ixor diff --git a/flaskwebproject/FlaskWebProject1/Lib/orig-prefix.txt b/flaskwebproject/FlaskWebProject1/Lib/orig-prefix.txt new file mode 100644 index 0000000..7f187f9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/orig-prefix.txt @@ -0,0 +1 @@ +C:\Python36 \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/Lib/os.py b/flaskwebproject/FlaskWebProject1/Lib/os.py new file mode 100644 index 0000000..c7e24a3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/os.py @@ -0,0 +1,1069 @@ +r"""OS routines for NT or Posix depending on what system we're on. + +This exports: + - all functions from posix or nt, e.g. unlink, stat, etc. + - os.path is either posixpath or ntpath + - os.name is either 'posix' or 'nt' + - os.curdir is a string representing the current directory (always '.') + - os.pardir is a string representing the parent directory (always '..') + - os.sep is the (or a most common) pathname separator ('/' or '\\') + - os.extsep is the extension separator (always '.') + - os.altsep is the alternate pathname separator (None or '/') + - os.pathsep is the component separator used in $PATH etc + - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n') + - os.defpath is the default search path for executables + - os.devnull is the file path of the null device ('/dev/null', etc.) + +Programs that import and use 'os' stand a better chance of being +portable between different platforms. Of course, they must then +only use functions that are defined by all platforms (e.g., unlink +and opendir), and leave all pathname manipulation to os.path +(e.g., split and join). +""" + +#' +import abc +import sys, errno +import stat as st + +_names = sys.builtin_module_names + +# Note: more names are added to __all__ later. +__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep", + "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR", + "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen", + "popen", "extsep"] + +def _exists(name): + return name in globals() + +def _get_exports_list(module): + try: + return list(module.__all__) + except AttributeError: + return [n for n in dir(module) if n[0] != '_'] + +# Any new dependencies of the os module and/or changes in path separator +# requires updating importlib as well. +if 'posix' in _names: + name = 'posix' + linesep = '\n' + from posix import * + try: + from posix import _exit + __all__.append('_exit') + except ImportError: + pass + import posixpath as path + + try: + from posix import _have_functions + except ImportError: + pass + + import posix + __all__.extend(_get_exports_list(posix)) + del posix + +elif 'nt' in _names: + name = 'nt' + linesep = '\r\n' + from nt import * + try: + from nt import _exit + __all__.append('_exit') + except ImportError: + pass + import ntpath as path + + import nt + __all__.extend(_get_exports_list(nt)) + del nt + + try: + from nt import _have_functions + except ImportError: + pass + +else: + raise ImportError('no os specific module found') + +sys.modules['os.path'] = path +from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, + devnull) + +del _names + + +if _exists("_have_functions"): + _globals = globals() + def _add(str, fn): + if (fn in _globals) and (str in _have_functions): + _set.add(_globals[fn]) + + _set = set() + _add("HAVE_FACCESSAT", "access") + _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_FUTIMESAT", "utime") + _add("HAVE_LINKAT", "link") + _add("HAVE_MKDIRAT", "mkdir") + _add("HAVE_MKFIFOAT", "mkfifo") + _add("HAVE_MKNODAT", "mknod") + _add("HAVE_OPENAT", "open") + _add("HAVE_READLINKAT", "readlink") + _add("HAVE_RENAMEAT", "rename") + _add("HAVE_SYMLINKAT", "symlink") + _add("HAVE_UNLINKAT", "unlink") + _add("HAVE_UNLINKAT", "rmdir") + _add("HAVE_UTIMENSAT", "utime") + supports_dir_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + supports_effective_ids = _set + + _set = set() + _add("HAVE_FCHDIR", "chdir") + _add("HAVE_FCHMOD", "chmod") + _add("HAVE_FCHOWN", "chown") + _add("HAVE_FDOPENDIR", "listdir") + _add("HAVE_FEXECVE", "execve") + _set.add(stat) # fstat always works + _add("HAVE_FTRUNCATE", "truncate") + _add("HAVE_FUTIMENS", "utime") + _add("HAVE_FUTIMES", "utime") + _add("HAVE_FPATHCONF", "pathconf") + if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3 + _add("HAVE_FSTATVFS", "statvfs") + supports_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + # Some platforms don't support lchmod(). Often the function exists + # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP. + # (No, I don't know why that's a good design.) ./configure will detect + # this and reject it--so HAVE_LCHMOD still won't be defined on such + # platforms. This is Very Helpful. + # + # However, sometimes platforms without a working lchmod() *do* have + # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15, + # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes + # it behave like lchmod(). So in theory it would be a suitable + # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s + # flag doesn't work *either*. Sadly ./configure isn't sophisticated + # enough to detect this condition--it only determines whether or not + # fchmodat() minimally works. + # + # Therefore we simply ignore fchmodat() when deciding whether or not + # os.chmod supports follow_symlinks. Just checking lchmod() is + # sufficient. After all--if you have a working fchmodat(), your + # lchmod() almost certainly works too. + # + # _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_LCHFLAGS", "chflags") + _add("HAVE_LCHMOD", "chmod") + if _exists("lchown"): # mac os x10.3 + _add("HAVE_LCHOWN", "chown") + _add("HAVE_LINKAT", "link") + _add("HAVE_LUTIMES", "utime") + _add("HAVE_LSTAT", "stat") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_UTIMENSAT", "utime") + _add("MS_WINDOWS", "stat") + supports_follow_symlinks = _set + + del _set + del _have_functions + del _globals + del _add + + +# Python uses fixed values for the SEEK_ constants; they are mapped +# to native constants if necessary in posixmodule.c +# Other possible SEEK values are directly imported from posixmodule.c +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Super directory utilities. +# (Inspired by Eric Raymond; the doc strings are mostly his) + +def makedirs(name, mode=0o777, exist_ok=False): + """makedirs(name [, mode=0o777][, exist_ok=False]) + + Super-mkdir; create a leaf directory and all intermediate ones. Works like + mkdir, except that any intermediate path segment (not just the rightmost) + will be created if it does not exist. If the target directory already + exists, raise an OSError if exist_ok is False. Otherwise no exception is + raised. This is recursive. + + """ + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + if head and tail and not path.exists(head): + try: + makedirs(head, mode, exist_ok) + except FileExistsError: + # Defeats race condition when another thread created the path + pass + cdir = curdir + if isinstance(tail, bytes): + cdir = bytes(curdir, 'ASCII') + if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists + return + try: + mkdir(name, mode) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not path.isdir(name): + raise + +def removedirs(name): + """removedirs(name) + + Super-rmdir; remove a leaf directory and all empty intermediate + ones. Works like rmdir except that, if the leaf directory is + successfully removed, directories corresponding to rightmost path + segments will be pruned away until either the whole path is + consumed or an error occurs. Errors during this latter phase are + ignored -- they generally mean that a directory was not empty. + + """ + rmdir(name) + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + while head and tail: + try: + rmdir(head) + except OSError: + break + head, tail = path.split(head) + +def renames(old, new): + """renames(old, new) + + Super-rename; create directories as necessary and delete any left + empty. Works like rename, except creation of any intermediate + directories needed to make the new pathname good is attempted + first. After the rename, directories corresponding to rightmost + path segments of the old name will be pruned until either the + whole path is consumed or a nonempty directory is found. + + Note: this function can fail with the new directory structure made + if you lack permissions needed to unlink the leaf directory or + file. + + """ + head, tail = path.split(new) + if head and tail and not path.exists(head): + makedirs(head) + rename(old, new) + head, tail = path.split(old) + if head and tail: + try: + removedirs(head) + except OSError: + pass + +__all__.extend(["makedirs", "removedirs", "renames"]) + +def walk(top, topdown=True, onerror=None, followlinks=False): + """Directory tree generator. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), yields a 3-tuple + + dirpath, dirnames, filenames + + dirpath is a string, the path to the directory. dirnames is a list of + the names of the subdirectories in dirpath (excluding '.' and '..'). + filenames is a list of the names of the non-directory files in dirpath. + Note that the names in the lists are just names, with no path components. + To get a full path (which begins with top) to a file or directory in + dirpath, do os.path.join(dirpath, name). + + If optional arg 'topdown' is true or not specified, the triple for a + directory is generated before the triples for any of its subdirectories + (directories are generated top down). If topdown is false, the triple + for a directory is generated after the triples for all of its + subdirectories (directories are generated bottom up). + + When topdown is true, the caller can modify the dirnames list in-place + (e.g., via del or slice assignment), and walk will only recurse into the + subdirectories whose names remain in dirnames; this can be used to prune the + search, or to impose a specific order of visiting. Modifying dirnames when + topdown is false is ineffective, since the directories in dirnames have + already been generated by the time dirnames itself is generated. No matter + the value of topdown, the list of subdirectories is retrieved before the + tuples for the directory and its subdirectories are generated. + + By default errors from the os.scandir() call are ignored. If + optional arg 'onerror' is specified, it should be a function; it + will be called with one argument, an OSError instance. It can + report the error to continue with the walk, or raise the exception + to abort the walk. Note that the filename is available as the + filename attribute of the exception object. + + By default, os.walk does not follow symbolic links to subdirectories on + systems that support them. In order to get this functionality, set the + optional argument 'followlinks' to true. + + Caution: if you pass a relative pathname for top, don't change the + current working directory between resumptions of walk. walk never + changes the current directory, and assumes that the client doesn't + either. + + Example: + + import os + from os.path import join, getsize + for root, dirs, files in os.walk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([getsize(join(root, name)) for name in files]), end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + + """ + top = fspath(top) + dirs = [] + nondirs = [] + walk_dirs = [] + + # We may not have read permission for top, in which case we can't + # get a list of the files the directory contains. os.walk + # always suppressed the exception then, rather than blow up for a + # minor reason when (say) a thousand readable directories are still + # left to visit. That logic is copied here. + try: + # Note that scandir is global in this module due + # to earlier import-*. + scandir_it = scandir(top) + except OSError as error: + if onerror is not None: + onerror(error) + return + + with scandir_it: + while True: + try: + try: + entry = next(scandir_it) + except StopIteration: + break + except OSError as error: + if onerror is not None: + onerror(error) + return + + try: + is_dir = entry.is_dir() + except OSError: + # If is_dir() raises an OSError, consider that the entry is not + # a directory, same behaviour than os.path.isdir(). + is_dir = False + + if is_dir: + dirs.append(entry.name) + else: + nondirs.append(entry.name) + + if not topdown and is_dir: + # Bottom-up: recurse into sub-directory, but exclude symlinks to + # directories if followlinks is False + if followlinks: + walk_into = True + else: + try: + is_symlink = entry.is_symlink() + except OSError: + # If is_symlink() raises an OSError, consider that the + # entry is not a symbolic link, same behaviour than + # os.path.islink(). + is_symlink = False + walk_into = not is_symlink + + if walk_into: + walk_dirs.append(entry.path) + + # Yield before recursion if going top down + if topdown: + yield top, dirs, nondirs + + # Recurse into sub-directories + islink, join = path.islink, path.join + for dirname in dirs: + new_path = join(top, dirname) + # Issue #23605: os.path.islink() is used instead of caching + # entry.is_symlink() result during the loop on os.scandir() because + # the caller can replace the directory entry during the "yield" + # above. + if followlinks or not islink(new_path): + yield from walk(new_path, topdown, onerror, followlinks) + else: + # Recurse into sub-directories + for new_path in walk_dirs: + yield from walk(new_path, topdown, onerror, followlinks) + # Yield after recursion if going bottom up + yield top, dirs, nondirs + +__all__.append("walk") + +if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd: + + def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None): + """Directory tree generator. + + This behaves exactly like walk(), except that it yields a 4-tuple + + dirpath, dirnames, filenames, dirfd + + `dirpath`, `dirnames` and `filenames` are identical to walk() output, + and `dirfd` is a file descriptor referring to the directory `dirpath`. + + The advantage of fwalk() over walk() is that it's safe against symlink + races (when follow_symlinks is False). + + If dir_fd is not None, it should be a file descriptor open to a directory, + and top should be relative; top will then be relative to that directory. + (dir_fd is always supported for fwalk.) + + Caution: + Since fwalk() yields file descriptors, those are only valid until the + next iteration step, so you should dup() them if you want to keep them + for a longer period. + + Example: + + import os + for root, dirs, files, rootfd in os.fwalk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]), + end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + """ + if not isinstance(top, int) or not hasattr(top, '__index__'): + top = fspath(top) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd) + topfd = open(top, O_RDONLY, dir_fd=dir_fd) + try: + if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and + path.samestat(orig_st, stat(topfd)))): + yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks) + finally: + close(topfd) + + def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks): + # Note: This uses O(depth of the directory tree) file descriptors: if + # necessary, it can be adapted to only require O(1) FDs, see issue + # #13734. + + names = listdir(topfd) + dirs, nondirs = [], [] + for name in names: + try: + # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with + # walk() which reports symlinks to directories as directories. + # We do however check for symlinks before recursing into + # a subdirectory. + if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode): + dirs.append(name) + else: + nondirs.append(name) + except OSError: + try: + # Add dangling symlinks, ignore disappeared files + if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False) + .st_mode): + nondirs.append(name) + except OSError: + continue + + if topdown: + yield toppath, dirs, nondirs, topfd + + for name in dirs: + try: + orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks) + dirfd = open(name, O_RDONLY, dir_fd=topfd) + except OSError as err: + if onerror is not None: + onerror(err) + continue + try: + if follow_symlinks or path.samestat(orig_st, stat(dirfd)): + dirpath = path.join(toppath, name) + yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks) + finally: + close(dirfd) + + if not topdown: + yield toppath, dirs, nondirs, topfd + + __all__.append("fwalk") + +# Make sure os.environ exists, at least +try: + environ +except NameError: + environ = {} + +def execl(file, *args): + """execl(file, *args) + + Execute the executable file with argument list args, replacing the + current process. """ + execv(file, args) + +def execle(file, *args): + """execle(file, *args, env) + + Execute the executable file with argument list args and + environment env, replacing the current process. """ + env = args[-1] + execve(file, args[:-1], env) + +def execlp(file, *args): + """execlp(file, *args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. """ + execvp(file, args) + +def execlpe(file, *args): + """execlpe(file, *args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env, replacing the current + process. """ + env = args[-1] + execvpe(file, args[:-1], env) + +def execvp(file, args): + """execvp(file, args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. + args may be a list or tuple of strings. """ + _execvpe(file, args) + +def execvpe(file, args, env): + """execvpe(file, args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env , replacing the + current process. + args may be a list or tuple of strings. """ + _execvpe(file, args, env) + +__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"]) + +def _execvpe(file, args, env=None): + if env is not None: + exec_func = execve + argrest = (args, env) + else: + exec_func = execv + argrest = (args,) + env = environ + + head, tail = path.split(file) + if head: + exec_func(file, *argrest) + return + last_exc = saved_exc = None + saved_tb = None + path_list = get_exec_path(env) + if name != 'nt': + file = fsencode(file) + path_list = map(fsencode, path_list) + for dir in path_list: + fullname = path.join(dir, file) + try: + exec_func(fullname, *argrest) + except OSError as e: + last_exc = e + tb = sys.exc_info()[2] + if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR + and saved_exc is None): + saved_exc = e + saved_tb = tb + if saved_exc: + raise saved_exc.with_traceback(saved_tb) + raise last_exc.with_traceback(tb) + + +def get_exec_path(env=None): + """Returns the sequence of directories that will be searched for the + named executable (similar to a shell) when launching a process. + + *env* must be an environment variable dict or None. If *env* is None, + os.environ will be used. + """ + # Use a local import instead of a global import to limit the number of + # modules loaded at startup: the os module is always loaded at startup by + # Python. It may also avoid a bootstrap issue. + import warnings + + if env is None: + env = environ + + # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a + # BytesWarning when using python -b or python -bb: ignore the warning + with warnings.catch_warnings(): + warnings.simplefilter("ignore", BytesWarning) + + try: + path_list = env.get('PATH') + except TypeError: + path_list = None + + if supports_bytes_environ: + try: + path_listb = env[b'PATH'] + except (KeyError, TypeError): + pass + else: + if path_list is not None: + raise ValueError( + "env cannot contain 'PATH' and b'PATH' keys") + path_list = path_listb + + if path_list is not None and isinstance(path_list, bytes): + path_list = fsdecode(path_list) + + if path_list is None: + path_list = defpath + return path_list.split(pathsep) + + +# Change environ to automatically call putenv(), unsetenv if they exist. +from _collections_abc import MutableMapping + +class _Environ(MutableMapping): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + self.encodekey = encodekey + self.decodekey = decodekey + self.encodevalue = encodevalue + self.decodevalue = decodevalue + self.putenv = putenv + self.unsetenv = unsetenv + self._data = data + + def __getitem__(self, key): + try: + value = self._data[self.encodekey(key)] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + return self.decodevalue(value) + + def __setitem__(self, key, value): + key = self.encodekey(key) + value = self.encodevalue(value) + self.putenv(key, value) + self._data[key] = value + + def __delitem__(self, key): + encodedkey = self.encodekey(key) + self.unsetenv(encodedkey) + try: + del self._data[encodedkey] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + + def __iter__(self): + # list() from dict object is an atomic operation + keys = list(self._data) + for key in keys: + yield self.decodekey(key) + + def __len__(self): + return len(self._data) + + def __repr__(self): + return 'environ({{{}}})'.format(', '.join( + ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value)) + for key, value in self._data.items()))) + + def copy(self): + return dict(self) + + def setdefault(self, key, value): + if key not in self: + self[key] = value + return self[key] + +try: + _putenv = putenv +except NameError: + _putenv = lambda key, value: None +else: + if "putenv" not in __all__: + __all__.append("putenv") + +try: + _unsetenv = unsetenv +except NameError: + _unsetenv = lambda key: _putenv(key, "") +else: + if "unsetenv" not in __all__: + __all__.append("unsetenv") + +def _createenviron(): + if name == 'nt': + # Where Env Var Names Must Be UPPERCASE + def check_str(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value + encode = check_str + decode = str + def encodekey(key): + return encode(key).upper() + data = {} + for key, value in environ.items(): + data[encodekey(key)] = value + else: + # Where Env Var Names Can Be Mixed Case + encoding = sys.getfilesystemencoding() + def encode(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value.encode(encoding, 'surrogateescape') + def decode(value): + return value.decode(encoding, 'surrogateescape') + encodekey = encode + data = environ + return _Environ(data, + encodekey, decode, + encode, decode, + _putenv, _unsetenv) + +# unicode environ +environ = _createenviron() +del _createenviron + + +def getenv(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are str.""" + return environ.get(key, default) + +supports_bytes_environ = (name != 'nt') +__all__.extend(("getenv", "supports_bytes_environ")) + +if supports_bytes_environ: + def _check_bytes(value): + if not isinstance(value, bytes): + raise TypeError("bytes expected, not %s" % type(value).__name__) + return value + + # bytes environ + environb = _Environ(environ._data, + _check_bytes, bytes, + _check_bytes, bytes, + _putenv, _unsetenv) + del _check_bytes + + def getenvb(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are bytes.""" + return environb.get(key, default) + + __all__.extend(("environb", "getenvb")) + +def _fscodec(): + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + + def fsencode(filename): + """Encode filename (an os.PathLike, bytes, or str) to the filesystem + encoding with 'surrogateescape' error handler, return bytes unchanged. + On Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, str): + return filename.encode(encoding, errors) + else: + return filename + + def fsdecode(filename): + """Decode filename (an os.PathLike, bytes, or str) from the filesystem + encoding with 'surrogateescape' error handler, return str unchanged. On + Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, bytes): + return filename.decode(encoding, errors) + else: + return filename + + return fsencode, fsdecode + +fsencode, fsdecode = _fscodec() +del _fscodec + +# Supply spawn*() (probably only for Unix) +if _exists("fork") and not _exists("spawnv") and _exists("execv"): + + P_WAIT = 0 + P_NOWAIT = P_NOWAITO = 1 + + __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"]) + + # XXX Should we support P_DETACH? I suppose it could fork()**2 + # and close the std I/O streams. Also, P_OVERLAY is the same + # as execv*()? + + def _spawnvef(mode, file, args, env, func): + # Internal helper; func is the exec*() function to use + if not isinstance(args, (tuple, list)): + raise TypeError('argv must be a tuple or a list') + if not args or not args[0]: + raise ValueError('argv first element cannot be empty') + pid = fork() + if not pid: + # Child + try: + if env is None: + func(file, args) + else: + func(file, args, env) + except: + _exit(127) + else: + # Parent + if mode == P_NOWAIT: + return pid # Caller is responsible for waiting! + while 1: + wpid, sts = waitpid(pid, 0) + if WIFSTOPPED(sts): + continue + elif WIFSIGNALED(sts): + return -WTERMSIG(sts) + elif WIFEXITED(sts): + return WEXITSTATUS(sts) + else: + raise OSError("Not stopped, signaled or exited???") + + def spawnv(mode, file, args): + """spawnv(mode, file, args) -> integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execv) + + def spawnve(mode, file, args, env): + """spawnve(mode, file, args, env) -> integer + +Execute file with arguments from args in a subprocess with the +specified environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execve) + + # Note: spawnvp[e] isn't currently supported on Windows + + def spawnvp(mode, file, args): + """spawnvp(mode, file, args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, None, execvp) + + def spawnvpe(mode, file, args, env): + """spawnvpe(mode, file, args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return _spawnvef(mode, file, args, env, execvpe) + + + __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"]) + + +if _exists("spawnv"): + # These aren't supplied by the basic Windows code + # but can be easily implemented in Python + + def spawnl(mode, file, *args): + """spawnl(mode, file, *args) -> integer + +Execute file with arguments from args in a subprocess. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnv(mode, file, args) + + def spawnle(mode, file, *args): + """spawnle(mode, file, *args, env) -> integer + +Execute file with arguments from args in a subprocess with the +supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnve(mode, file, args[:-1], env) + + + __all__.extend(["spawnl", "spawnle"]) + + +if _exists("spawnvp"): + # At the moment, Windows doesn't implement spawnvp[e], + # so it won't have spawnlp[e] either. + def spawnlp(mode, file, *args): + """spawnlp(mode, file, *args) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + return spawnvp(mode, file, args) + + def spawnlpe(mode, file, *args): + """spawnlpe(mode, file, *args, env) -> integer + +Execute file (which is looked for along $PATH) with arguments from +args in a subprocess with the supplied environment. +If mode == P_NOWAIT return the pid of the process. +If mode == P_WAIT return the process's exit code if it exits normally; +otherwise return -SIG, where SIG is the signal that killed it. """ + env = args[-1] + return spawnvpe(mode, file, args[:-1], env) + + + __all__.extend(["spawnlp", "spawnlpe"]) + + +# Supply os.popen() +def popen(cmd, mode="r", buffering=-1): + if not isinstance(cmd, str): + raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) + if mode not in ("r", "w"): + raise ValueError("invalid mode %r" % mode) + if buffering == 0 or buffering is None: + raise ValueError("popen() does not support unbuffered streams") + import subprocess, io + if mode == "r": + proc = subprocess.Popen(cmd, + shell=True, + stdout=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdout), proc) + else: + proc = subprocess.Popen(cmd, + shell=True, + stdin=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdin), proc) + +# Helper for popen() -- a proxy for a file whose close waits for the process +class _wrap_close: + def __init__(self, stream, proc): + self._stream = stream + self._proc = proc + def close(self): + self._stream.close() + returncode = self._proc.wait() + if returncode == 0: + return None + if name == 'nt': + return returncode + else: + return returncode << 8 # Shift left to match old behavior + def __enter__(self): + return self + def __exit__(self, *args): + self.close() + def __getattr__(self, name): + return getattr(self._stream, name) + def __iter__(self): + return iter(self._stream) + +# Supply os.fdopen() +def fdopen(fd, *args, **kwargs): + if not isinstance(fd, int): + raise TypeError("invalid fd type (%s, expected integer)" % type(fd)) + import io + return io.open(fd, *args, **kwargs) + + +# For testing purposes, make sure the function is available when the C +# implementation exists. +def _fspath(path): + """Return the path representation of a path-like object. + + If str or bytes is passed in, it is returned unchanged. Otherwise the + os.PathLike interface is used to get the path representation. If the + path representation is not str or bytes, TypeError is raised. If the + provided path is not str, bytes, or os.PathLike, TypeError is raised. + """ + if isinstance(path, (str, bytes)): + return path + + # Work from the object's type to match method resolution of other magic + # methods. + path_type = type(path) + try: + path_repr = path_type.__fspath__(path) + except AttributeError: + if hasattr(path_type, '__fspath__'): + raise + else: + raise TypeError("expected str, bytes or os.PathLike object, " + "not " + path_type.__name__) + if isinstance(path_repr, (str, bytes)): + return path_repr + else: + raise TypeError("expected {}.__fspath__() to return str or bytes, " + "not {}".format(path_type.__name__, + type(path_repr).__name__)) + +# If there is no C implementation, make the pure Python version the +# implementation as transparently as possible. +if not _exists('fspath'): + fspath = _fspath + fspath.__name__ = "fspath" + + +class PathLike(abc.ABC): + + """Abstract base class for implementing the file system path protocol.""" + + @abc.abstractmethod + def __fspath__(self): + """Return the file system path representation of the object.""" + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return hasattr(subclass, '__fspath__') diff --git a/flaskwebproject/FlaskWebProject1/Lib/posixpath.py b/flaskwebproject/FlaskWebProject1/Lib/posixpath.py new file mode 100644 index 0000000..e92186c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/posixpath.py @@ -0,0 +1,522 @@ +"""Common operations on Posix pathnames. + +Instead of importing this module directly, import os and refer to +this module as os.path. The "os.path" name is an alias for this +module on Posix systems; on other systems (e.g. Mac, Windows), +os.path provides the same operations in a manner specific to that +platform, and is an alias to another module (e.g. macpath, ntpath). + +Some of this can actually be useful on non-Posix systems too, e.g. +for manipulation of the pathname component of URLs. +""" + +# Strings representing various path-related bits and pieces. +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '/' +pathsep = ':' +defpath = ':/bin:/usr/bin' +altsep = None +devnull = '/dev/null' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime","islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "samefile","sameopenfile","samestat", + "curdir","pardir","sep","pathsep","defpath","altsep","extsep", + "devnull","realpath","supports_unicode_filenames","relpath", + "commonpath"] + + +def _get_sep(path): + if isinstance(path, bytes): + return b'/' + else: + return '/' + +# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac. +# On MS-DOS this may also turn slashes into backslashes; however, other +# normalizations (such as optimizing '../' away) are not allowed +# (another function should be defined to do that). + +def normcase(s): + """Normalize case of pathname. Has no effect under Posix""" + s = os.fspath(s) + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not '{}'".format(s.__class__.__name__)) + return s + + +# Return whether a path is absolute. +# Trivial in Posix, harder on the Mac or MS-DOS. + +def isabs(s): + """Test whether a path is absolute""" + s = os.fspath(s) + sep = _get_sep(s) + return s.startswith(sep) + + +# Join pathnames. +# Ignore the previous parts if a part is absolute. +# Insert a '/' unless the first part is empty or already ends in '/'. + +def join(a, *p): + """Join two or more pathname components, inserting '/' as needed. + If any component is an absolute path, all previous path components + will be discarded. An empty last part will result in a path that + ends with a separator.""" + a = os.fspath(a) + sep = _get_sep(a) + path = a + try: + if not p: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + for b in map(os.fspath, p): + if b.startswith(sep): + path = b + elif not path or path.endswith(sep): + path += b + else: + path += sep + b + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', a, *p) + raise + return path + + +# Split a path in head (everything up to the last '/') and tail (the +# rest). If the path ends in '/', tail will be empty. If there is no +# '/' in the path, head will be empty. +# Trailing '/'es are stripped from head unless it is the root. + +def split(p): + """Split a pathname. Returns tuple "(head, tail)" where "tail" is + everything after the final slash. Either part may be empty.""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head, tail = p[:i], p[i:] + if head and head != sep*len(head): + head = head.rstrip(sep) + return head, tail + + +# Split a path in root and extension. +# The extension is everything starting at the last dot in the last +# pathname component; the root is everything before that. +# It is always true that root + ext == p. + +def splitext(p): + p = os.fspath(p) + if isinstance(p, bytes): + sep = b'/' + extsep = b'.' + else: + sep = '/' + extsep = '.' + return genericpath._splitext(p, sep, None, extsep) +splitext.__doc__ = genericpath._splitext.__doc__ + +# Split a pathname into a drive specification and the rest of the +# path. Useful on DOS/Windows/NT; on Unix, the drive is always empty. + +def splitdrive(p): + """Split a pathname into drive and path. On Posix, drive is always + empty.""" + p = os.fspath(p) + return p[:0], p + + +# Return the tail (basename) part of a path, same as split(path)[1]. + +def basename(p): + """Returns the final component of a pathname""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + return p[i:] + + +# Return the head (dirname) part of a path, same as split(path)[0]. + +def dirname(p): + """Returns the directory component of a pathname""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head = p[:i] + if head and head != sep*len(head): + head = head.rstrip(sep) + return head + + +# Is a path a symbolic link? +# This will always return false on systems where os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link""" + try: + st = os.lstat(path) + except (OSError, AttributeError): + return False + return stat.S_ISLNK(st.st_mode) + +# Being true for dangling symbolic links is also useful. + +def lexists(path): + """Test whether a path exists. Returns True for broken symbolic links""" + try: + os.lstat(path) + except OSError: + return False + return True + + +# Is a path a mount point? +# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) + +def ismount(path): + """Test whether a path is a mount point""" + try: + s1 = os.lstat(path) + except OSError: + # It doesn't exist -- so not a mount point. :-) + return False + else: + # A symlink can never be a mount point + if stat.S_ISLNK(s1.st_mode): + return False + + if isinstance(path, bytes): + parent = join(path, b'..') + else: + parent = join(path, '..') + parent = realpath(parent) + try: + s2 = os.lstat(parent) + except OSError: + return False + + dev1 = s1.st_dev + dev2 = s2.st_dev + if dev1 != dev2: + return True # path/.. on a different device as path + ino1 = s1.st_ino + ino2 = s2.st_ino + if ino1 == ino2: + return True # path/.. is the same i-node as path + return False + + +# Expand paths beginning with '~' or '~user'. +# '~' means $HOME; '~user' means that user's home directory. +# If the path doesn't begin with '~', or if the user or $HOME is unknown, +# the path is returned unchanged (leaving error reporting to whatever +# function is called with the expanded path as argument). +# See also module 'glob' for expansion of *, ? and [...] in pathnames. +# (A function should also be defined to do full *sh-style environment +# variable expansion.) + +def expanduser(path): + """Expand ~ and ~user constructions. If user or $HOME is unknown, + do nothing.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + sep = _get_sep(path) + i = path.find(sep, 1) + if i < 0: + i = len(path) + if i == 1: + if 'HOME' not in os.environ: + import pwd + userhome = pwd.getpwuid(os.getuid()).pw_dir + else: + userhome = os.environ['HOME'] + else: + import pwd + name = path[1:i] + if isinstance(name, bytes): + name = str(name, 'ASCII') + try: + pwent = pwd.getpwnam(name) + except KeyError: + return path + userhome = pwent.pw_dir + if isinstance(path, bytes): + userhome = os.fsencode(userhome) + root = b'/' + else: + root = '/' + userhome = userhome.rstrip(root) + return (userhome + path[i:]) or root + + +# Expand paths containing shell variable substitutions. +# This expands the forms $variable and ${variable} only. +# Non-existent variables are left unchanged. + +_varprog = None +_varprogb = None + +def expandvars(path): + """Expand shell variables of form $var and ${var}. Unknown variables + are left unchanged.""" + path = os.fspath(path) + global _varprog, _varprogb + if isinstance(path, bytes): + if b'$' not in path: + return path + if not _varprogb: + import re + _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprogb.search + start = b'{' + end = b'}' + environ = getattr(os, 'environb', None) + else: + if '$' not in path: + return path + if not _varprog: + import re + _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprog.search + start = '{' + end = '}' + environ = os.environ + i = 0 + while True: + m = search(path, i) + if not m: + break + i, j = m.span(0) + name = m.group(1) + if name.startswith(start) and name.endswith(end): + name = name[1:-1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(name)]) + else: + value = environ[name] + except KeyError: + i = j + else: + tail = path[j:] + path = path[:i] + value + i = len(path) + path += tail + return path + + +# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. +# It should be understood that this may change the meaning of the path +# if it contains symbolic links! + +def normpath(path): + """Normalize path, eliminating double slashes, etc.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'/' + empty = b'' + dot = b'.' + dotdot = b'..' + else: + sep = '/' + empty = '' + dot = '.' + dotdot = '..' + if path == empty: + return dot + initial_slashes = path.startswith(sep) + # POSIX allows one or two initial slashes, but treats three or more + # as single slash. + if (initial_slashes and + path.startswith(sep*2) and not path.startswith(sep*3)): + initial_slashes = 2 + comps = path.split(sep) + new_comps = [] + for comp in comps: + if comp in (empty, dot): + continue + if (comp != dotdot or (not initial_slashes and not new_comps) or + (new_comps and new_comps[-1] == dotdot)): + new_comps.append(comp) + elif new_comps: + new_comps.pop() + comps = new_comps + path = sep.join(comps) + if initial_slashes: + path = sep*initial_slashes + path + return path or dot + + +def abspath(path): + """Return an absolute path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + + +# Return a canonical path (i.e. the absolute location of a file on the +# filesystem). + +def realpath(filename): + """Return the canonical path of the specified filename, eliminating any +symbolic links encountered in the path.""" + filename = os.fspath(filename) + path, ok = _joinrealpath(filename[:0], filename, {}) + return abspath(path) + +# Join two paths, normalizing and eliminating any symbolic links +# encountered in the second path. +def _joinrealpath(path, rest, seen): + if isinstance(path, bytes): + sep = b'/' + curdir = b'.' + pardir = b'..' + else: + sep = '/' + curdir = '.' + pardir = '..' + + if isabs(rest): + rest = rest[1:] + path = sep + + while rest: + name, _, rest = rest.partition(sep) + if not name or name == curdir: + # current dir + continue + if name == pardir: + # parent dir + if path: + path, name = split(path) + if name == pardir: + path = join(path, pardir, pardir) + else: + path = pardir + continue + newpath = join(path, name) + if not islink(newpath): + path = newpath + continue + # Resolve the symbolic link + if newpath in seen: + # Already seen this path + path = seen[newpath] + if path is not None: + # use cached value + continue + # The symlink is not resolved, so we must have a symlink loop. + # Return already resolved part + rest of the path unchanged. + return join(newpath, rest), False + seen[newpath] = None # not resolved symlink + path, ok = _joinrealpath(path, os.readlink(newpath), seen) + if not ok: + return join(path, rest), False + seen[newpath] = path # resolved symlink + + return path, True + + +supports_unicode_filenames = (sys.platform == 'darwin') + +def relpath(path, start=None): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + path = os.fspath(path) + if isinstance(path, bytes): + curdir = b'.' + sep = b'/' + pardir = b'..' + else: + curdir = '.' + sep = '/' + pardir = '..' + + if start is None: + start = curdir + else: + start = os.fspath(start) + + try: + start_list = [x for x in abspath(start).split(sep) if x] + path_list = [x for x in abspath(path).split(sep) if x] + # Work out how much of the filepath is shared by start and path. + i = len(commonprefix([start_list, path_list])) + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + except (TypeError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The paths are not normalized before comparing them (this is the +# responsibility of the caller). Any trailing separator is stripped from the +# returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'/' + curdir = b'.' + else: + sep = '/' + curdir = '.' + + try: + split_paths = [path.split(sep) for path in paths] + + try: + isabs, = set(p[:1] == sep for p in paths) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + common = s1 + for i, c in enumerate(s1): + if c != s2[i]: + common = s1[:i] + break + + prefix = sep if isabs else sep[:0] + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise diff --git a/flaskwebproject/FlaskWebProject1/Lib/random.py b/flaskwebproject/FlaskWebProject1/Lib/random.py new file mode 100644 index 0000000..7a2585e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/random.py @@ -0,0 +1,770 @@ +"""Random variable generators. + + integers + -------- + uniform within range + + sequences + --------- + pick random element + pick random sample + pick weighted random sample + generate random permutation + + distributions on the real line: + ------------------------------ + uniform + triangular + normal (Gaussian) + lognormal + negative exponential + gamma + beta + pareto + Weibull + + distributions on the circle (angles 0 to 2pi) + --------------------------------------------- + circular uniform + von Mises + +General notes on the underlying Mersenne Twister core generator: + +* The period is 2**19937-1. +* It is one of the most extensively tested generators in existence. +* The random() method is implemented in C, executes in a single Python step, + and is, therefore, threadsafe. + +""" + +from warnings import warn as _warn +from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType +from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil +from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from os import urandom as _urandom +from _collections_abc import Set as _Set, Sequence as _Sequence +from hashlib import sha512 as _sha512 +import itertools as _itertools +import bisect as _bisect + +__all__ = ["Random","seed","random","uniform","randint","choice","sample", + "randrange","shuffle","normalvariate","lognormvariate", + "expovariate","vonmisesvariate","gammavariate","triangular", + "gauss","betavariate","paretovariate","weibullvariate", + "getstate","setstate", "getrandbits", "choices", + "SystemRandom"] + +NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) +TWOPI = 2.0*_pi +LOG4 = _log(4.0) +SG_MAGICCONST = 1.0 + _log(4.5) +BPF = 53 # Number of bits in a float +RECIP_BPF = 2**-BPF + + +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. Adapted by Raymond Hettinger for use with +# the Mersenne Twister and os.urandom() core generators. + +import _random + +class Random(_random.Random): + """Random number generator base class used by bound module functions. + + Used to instantiate instances of Random to get generators that don't + share state. + + Class Random can also be subclassed if you want to use a different basic + generator of your own devising: in that case, override the following + methods: random(), seed(), getstate(), and setstate(). + Optionally, implement a getrandbits() method so that randrange() + can cover arbitrarily large ranges. + + """ + + VERSION = 3 # used by getstate/setstate + + def __init__(self, x=None): + """Initialize an instance. + + Optional argument x controls seeding, as for Random.seed(). + """ + + self.seed(x) + self.gauss_next = None + + def seed(self, a=None, version=2): + """Initialize internal state from hashable object. + + None or no argument seeds from current time or from an operating + system specific randomness source if available. + + If *a* is an int, all bits are used. + + For version 2 (the default), all of the bits are used if *a* is a str, + bytes, or bytearray. For version 1 (provided for reproducing random + sequences from older versions of Python), the algorithm for str and + bytes generates a narrower range of seeds. + + """ + + if version == 1 and isinstance(a, (str, bytes)): + a = a.decode('latin-1') if isinstance(a, bytes) else a + x = ord(a[0]) << 7 if a else 0 + for c in map(ord, a): + x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF + x ^= len(a) + a = -2 if x == -1 else x + + if version == 2 and isinstance(a, (str, bytes, bytearray)): + if isinstance(a, str): + a = a.encode() + a += _sha512(a).digest() + a = int.from_bytes(a, 'big') + + super().seed(a) + self.gauss_next = None + + def getstate(self): + """Return internal state; can be passed to setstate() later.""" + return self.VERSION, super().getstate(), self.gauss_next + + def setstate(self, state): + """Restore internal state from object returned by getstate().""" + version = state[0] + if version == 3: + version, internalstate, self.gauss_next = state + super().setstate(internalstate) + elif version == 2: + version, internalstate, self.gauss_next = state + # In version 2, the state was saved as signed ints, which causes + # inconsistencies between 32/64-bit systems. The state is + # really unsigned 32-bit ints, so we convert negative ints from + # version 2 to positive longs for version 3. + try: + internalstate = tuple(x % (2**32) for x in internalstate) + except ValueError as e: + raise TypeError from e + super().setstate(internalstate) + else: + raise ValueError("state with version %s passed to " + "Random.setstate() of version %s" % + (version, self.VERSION)) + +## ---- Methods below this point do not need to be overridden when +## ---- subclassing for the purpose of using a different core generator. + +## -------------------- pickle support ------------------- + + # Issue 17489: Since __reduce__ was defined to fix #759889 this is no + # longer called; we leave it here because it has been here since random was + # rewritten back in 2001 and why risk breaking something. + def __getstate__(self): # for pickle + return self.getstate() + + def __setstate__(self, state): # for pickle + self.setstate(state) + + def __reduce__(self): + return self.__class__, (), self.getstate() + +## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1, _int=int): + """Choose a random item from range(start, stop[, step]). + + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. + + """ + + # This code is a bit messy to make it fast for the + # common case while still doing adequate error checking. + istart = _int(start) + if istart != start: + raise ValueError("non-integer arg 1 for randrange()") + if stop is None: + if istart > 0: + return self._randbelow(istart) + raise ValueError("empty range for randrange()") + + # stop argument supplied. + istop = _int(stop) + if istop != stop: + raise ValueError("non-integer stop for randrange()") + width = istop - istart + if step == 1 and width > 0: + return istart + self._randbelow(width) + if step == 1: + raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) + + # Non-unit step argument supplied. + istep = _int(step) + if istep != step: + raise ValueError("non-integer step for randrange()") + if istep > 0: + n = (width + istep - 1) // istep + elif istep < 0: + n = (width + istep + 1) // istep + else: + raise ValueError("zero step for randrange()") + + if n <= 0: + raise ValueError("empty range for randrange()") + + return istart + istep*self._randbelow(n) + + def randint(self, a, b): + """Return random integer in range [a, b], including both end points. + """ + + return self.randrange(a, b+1) + + def _randbelow(self, n, int=int, maxsize=1<= n: + r = getrandbits(k) + return r + # There's an overridden random() method but no new getrandbits() method, + # so we can only use random() from here. + if n >= maxsize: + _warn("Underlying random() generator does not supply \n" + "enough bits to choose from a population range this large.\n" + "To remove the range limitation, add a getrandbits() method.") + return int(random() * n) + if n == 0: + raise ValueError("Boundary cannot be zero") + rem = maxsize % n + limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 + r = random() + while r >= limit: + r = random() + return int(r*maxsize) % n + +## -------------------- sequence methods ------------------- + + def choice(self, seq): + """Choose a random element from a non-empty sequence.""" + try: + i = self._randbelow(len(seq)) + except ValueError: + raise IndexError('Cannot choose from an empty sequence') from None + return seq[i] + + def shuffle(self, x, random=None): + """Shuffle list x in place, and return None. + + Optional argument random is a 0-argument function returning a + random float in [0.0, 1.0); if it is the default None, the + standard random.random will be used. + + """ + + if random is None: + randbelow = self._randbelow + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = randbelow(i+1) + x[i], x[j] = x[j], x[i] + else: + _int = int + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = _int(random() * (i+1)) + x[i], x[j] = x[j], x[i] + + def sample(self, population, k): + """Chooses k unique random elements from a population sequence or set. + + Returns a new list containing elements from the population while + leaving the original population unchanged. The resulting list is + in selection order so that all sub-slices will also be valid random + samples. This allows raffle winners (the sample) to be partitioned + into grand prize and second place winners (the subslices). + + Members of the population need not be hashable or unique. If the + population contains repeats, then each occurrence is a possible + selection in the sample. + + To choose a sample in a range of integers, use range as an argument. + This is especially fast and space efficient for sampling from a + large population: sample(range(10000000), 60) + """ + + # Sampling without replacement entails tracking either potential + # selections (the pool) in a list or previous selections in a set. + + # When the number of selections is small compared to the + # population, then tracking selections is efficient, requiring + # only a small set and an occasional reselection. For + # a larger number of selections, the pool tracking method is + # preferred since the list takes less space than the + # set and it doesn't suffer from frequent reselections. + + if isinstance(population, _Set): + population = tuple(population) + if not isinstance(population, _Sequence): + raise TypeError("Population must be a sequence or set. For dicts, use list(d).") + randbelow = self._randbelow + n = len(population) + if not 0 <= k <= n: + raise ValueError("Sample larger than population or is negative") + result = [None] * k + setsize = 21 # size of a small set minus size of an empty list + if k > 5: + setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets + if n <= setsize: + # An n-length list is smaller than a k-length set + pool = list(population) + for i in range(k): # invariant: non-selected at [0,n-i) + j = randbelow(n-i) + result[i] = pool[j] + pool[j] = pool[n-i-1] # move non-selected item into vacancy + else: + selected = set() + selected_add = selected.add + for i in range(k): + j = randbelow(n) + while j in selected: + j = randbelow(n) + selected_add(j) + result[i] = population[j] + return result + + def choices(self, population, weights=None, *, cum_weights=None, k=1): + """Return a k sized list of population elements chosen with replacement. + + If the relative weights or cumulative weights are not specified, + the selections are made with equal probability. + + """ + random = self.random + if cum_weights is None: + if weights is None: + _int = int + total = len(population) + return [population[_int(random() * total)] for i in range(k)] + cum_weights = list(_itertools.accumulate(weights)) + elif weights is not None: + raise TypeError('Cannot specify both weights and cumulative weights') + if len(cum_weights) != len(population): + raise ValueError('The number of weights does not match the population') + bisect = _bisect.bisect + total = cum_weights[-1] + return [population[bisect(cum_weights, random() * total)] for i in range(k)] + +## -------------------- real-valued distributions ------------------- + +## -------------------- uniform distribution ------------------- + + def uniform(self, a, b): + "Get a random number in the range [a, b) or [a, b] depending on rounding." + return a + (b-a) * self.random() + +## -------------------- triangular -------------------- + + def triangular(self, low=0.0, high=1.0, mode=None): + """Triangular distribution. + + Continuous distribution bounded by given lower and upper limits, + and having a given mode value in-between. + + http://en.wikipedia.org/wiki/Triangular_distribution + + """ + u = self.random() + try: + c = 0.5 if mode is None else (mode - low) / (high - low) + except ZeroDivisionError: + return low + if u > c: + u = 1.0 - u + c = 1.0 - c + low, high = high, low + return low + (high - low) * (u * c) ** 0.5 + +## -------------------- normal distribution -------------------- + + def normalvariate(self, mu, sigma): + """Normal distribution. + + mu is the mean, and sigma is the standard deviation. + + """ + # mu = mean, sigma = standard deviation + + # Uses Kinderman and Monahan method. Reference: Kinderman, + # A.J. and Monahan, J.F., "Computer generation of random + # variables using the ratio of uniform deviates", ACM Trans + # Math Software, 3, (1977), pp257-260. + + random = self.random + while 1: + u1 = random() + u2 = 1.0 - random() + z = NV_MAGICCONST*(u1-0.5)/u2 + zz = z*z/4.0 + if zz <= -_log(u2): + break + return mu + z*sigma + +## -------------------- lognormal distribution -------------------- + + def lognormvariate(self, mu, sigma): + """Log normal distribution. + + If you take the natural logarithm of this distribution, you'll get a + normal distribution with mean mu and standard deviation sigma. + mu can have any value, and sigma must be greater than zero. + + """ + return _exp(self.normalvariate(mu, sigma)) + +## -------------------- exponential distribution -------------------- + + def expovariate(self, lambd): + """Exponential distribution. + + lambd is 1.0 divided by the desired mean. It should be + nonzero. (The parameter would be called "lambda", but that is + a reserved word in Python.) Returned values range from 0 to + positive infinity if lambd is positive, and from negative + infinity to 0 if lambd is negative. + + """ + # lambd: rate lambd = 1/mean + # ('lambda' is a Python reserved word) + + # we use 1-random() instead of random() to preclude the + # possibility of taking the log of zero. + return -_log(1.0 - self.random())/lambd + +## -------------------- von Mises distribution -------------------- + + def vonmisesvariate(self, mu, kappa): + """Circular data distribution. + + mu is the mean angle, expressed in radians between 0 and 2*pi, and + kappa is the concentration parameter, which must be greater than or + equal to zero. If kappa is equal to zero, this distribution reduces + to a uniform random angle over the range 0 to 2*pi. + + """ + # mu: mean angle (in radians between 0 and 2*pi) + # kappa: concentration parameter kappa (>= 0) + # if kappa = 0 generate uniform random angle + + # Based upon an algorithm published in: Fisher, N.I., + # "Statistical Analysis of Circular Data", Cambridge + # University Press, 1993. + + # Thanks to Magnus Kessler for a correction to the + # implementation of step 4. + + random = self.random + if kappa <= 1e-6: + return TWOPI * random() + + s = 0.5 / kappa + r = s + _sqrt(1.0 + s * s) + + while 1: + u1 = random() + z = _cos(_pi * u1) + + d = z / (r + z) + u2 = random() + if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d): + break + + q = 1.0 / r + f = (q + z) / (1.0 + q * z) + u3 = random() + if u3 > 0.5: + theta = (mu + _acos(f)) % TWOPI + else: + theta = (mu - _acos(f)) % TWOPI + + return theta + +## -------------------- gamma distribution -------------------- + + def gammavariate(self, alpha, beta): + """Gamma distribution. Not the gamma function! + + Conditions on the parameters are alpha > 0 and beta > 0. + + The probability distribution function is: + + x ** (alpha - 1) * math.exp(-x / beta) + pdf(x) = -------------------------------------- + math.gamma(alpha) * beta ** alpha + + """ + + # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 + + # Warning: a few older sources define the gamma distribution in terms + # of alpha > -1.0 + if alpha <= 0.0 or beta <= 0.0: + raise ValueError('gammavariate: alpha and beta must be > 0.0') + + random = self.random + if alpha > 1.0: + + # Uses R.C.H. Cheng, "The generation of Gamma + # variables with non-integral shape parameters", + # Applied Statistics, (1977), 26, No. 1, p71-74 + + ainv = _sqrt(2.0 * alpha - 1.0) + bbb = alpha - LOG4 + ccc = alpha + ainv + + while 1: + u1 = random() + if not 1e-7 < u1 < .9999999: + continue + u2 = 1.0 - random() + v = _log(u1/(1.0-u1))/ainv + x = alpha*_exp(v) + z = u1*u1*u2 + r = bbb+ccc*v-x + if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + return x * beta + + elif alpha == 1.0: + # expovariate(1) + u = random() + while u <= 1e-7: + u = random() + return -_log(u) * beta + + else: # alpha is between 0 and 1 (exclusive) + + # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle + + while 1: + u = random() + b = (_e + alpha)/_e + p = b*u + if p <= 1.0: + x = p ** (1.0/alpha) + else: + x = -_log((b-p)/alpha) + u1 = random() + if p > 1.0: + if u1 <= x ** (alpha - 1.0): + break + elif u1 <= _exp(-x): + break + return x * beta + +## -------------------- Gauss (faster alternative) -------------------- + + def gauss(self, mu, sigma): + """Gaussian distribution. + + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z*sigma + +## -------------------- beta -------------------- +## See +## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html +## for Ivan Frohne's insightful analysis of why the original implementation: +## +## def betavariate(self, alpha, beta): +## # Discrete Event Simulation in C, pp 87-88. +## +## y = self.expovariate(alpha) +## z = self.expovariate(1.0/beta) +## return z/(y+z) +## +## was dead wrong, and how it probably got that way. + + def betavariate(self, alpha, beta): + """Beta distribution. + + Conditions on the parameters are alpha > 0 and beta > 0. + Returned values range between 0 and 1. + + """ + + # This version due to Janne Sinkkonen, and matches all the std + # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). + y = self.gammavariate(alpha, 1.0) + if y == 0: + return 0.0 + else: + return y / (y + self.gammavariate(beta, 1.0)) + +## -------------------- Pareto -------------------- + + def paretovariate(self, alpha): + """Pareto distribution. alpha is the shape parameter.""" + # Jain, pg. 495 + + u = 1.0 - self.random() + return 1.0 / u ** (1.0/alpha) + +## -------------------- Weibull -------------------- + + def weibullvariate(self, alpha, beta): + """Weibull distribution. + + alpha is the scale parameter and beta is the shape parameter. + + """ + # Jain, pg. 499; bug fix courtesy Bill Arms + + u = 1.0 - self.random() + return alpha * (-_log(u)) ** (1.0/beta) + +## --------------- Operating System Random Source ------------------ + +class SystemRandom(Random): + """Alternate random number generator using sources provided + by the operating system (such as /dev/urandom on Unix or + CryptGenRandom on Windows). + + Not available on all systems (see os.urandom() for details). + """ + + def random(self): + """Get the next random number in the range [0.0, 1.0).""" + return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF + + def getrandbits(self, k): + """getrandbits(k) -> x. Generates an int with k random bits.""" + if k <= 0: + raise ValueError('number of bits must be greater than zero') + if k != int(k): + raise TypeError('number of bits should be an integer') + numbytes = (k + 7) // 8 # bits / 8 and rounded up + x = int.from_bytes(_urandom(numbytes), 'big') + return x >> (numbytes * 8 - k) # trim excess bits + + def seed(self, *args, **kwds): + "Stub method. Not used for a system random number generator." + return None + + def _notimplemented(self, *args, **kwds): + "Method should not be called for a system random number generator." + raise NotImplementedError('System entropy source does not have state.') + getstate = setstate = _notimplemented + +## -------------------- test program -------------------- + +def _test_generator(n, func, args): + import time + print(n, 'times', func.__name__) + total = 0.0 + sqsum = 0.0 + smallest = 1e10 + largest = -1e10 + t0 = time.time() + for i in range(n): + x = func(*args) + total += x + sqsum = sqsum + x*x + smallest = min(x, smallest) + largest = max(x, largest) + t1 = time.time() + print(round(t1-t0, 3), 'sec,', end=' ') + avg = total/n + stddev = _sqrt(sqsum/n - avg*avg) + print('avg %g, stddev %g, min %g, max %g\n' % \ + (avg, stddev, smallest, largest)) + + +def _test(N=2000): + _test_generator(N, random, ()) + _test_generator(N, normalvariate, (0.0, 1.0)) + _test_generator(N, lognormvariate, (0.0, 1.0)) + _test_generator(N, vonmisesvariate, (0.0, 1.0)) + _test_generator(N, gammavariate, (0.01, 1.0)) + _test_generator(N, gammavariate, (0.1, 1.0)) + _test_generator(N, gammavariate, (0.1, 2.0)) + _test_generator(N, gammavariate, (0.5, 1.0)) + _test_generator(N, gammavariate, (0.9, 1.0)) + _test_generator(N, gammavariate, (1.0, 1.0)) + _test_generator(N, gammavariate, (2.0, 1.0)) + _test_generator(N, gammavariate, (20.0, 1.0)) + _test_generator(N, gammavariate, (200.0, 1.0)) + _test_generator(N, gauss, (0.0, 1.0)) + _test_generator(N, betavariate, (3.0, 3.0)) + _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) + +# Create one instance, seeded from current time, and export its methods +# as module-level functions. The functions share state across all uses +#(both in the user's code and in the Python libraries), but that's fine +# for most programs and is easier for the casual user than making them +# instantiate their own Random() instance. + +_inst = Random() +seed = _inst.seed +random = _inst.random +uniform = _inst.uniform +triangular = _inst.triangular +randint = _inst.randint +choice = _inst.choice +randrange = _inst.randrange +sample = _inst.sample +shuffle = _inst.shuffle +choices = _inst.choices +normalvariate = _inst.normalvariate +lognormvariate = _inst.lognormvariate +expovariate = _inst.expovariate +vonmisesvariate = _inst.vonmisesvariate +gammavariate = _inst.gammavariate +gauss = _inst.gauss +betavariate = _inst.betavariate +paretovariate = _inst.paretovariate +weibullvariate = _inst.weibullvariate +getstate = _inst.getstate +setstate = _inst.setstate +getrandbits = _inst.getrandbits + +if __name__ == '__main__': + _test() diff --git a/flaskwebproject/FlaskWebProject1/Lib/re.py b/flaskwebproject/FlaskWebProject1/Lib/re.py new file mode 100644 index 0000000..d321cff --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/re.py @@ -0,0 +1,381 @@ +# +# Secret Labs' Regular Expression Engine +# +# re-compatible interface for the sre matching engine +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# This version of the SRE library can be redistributed under CNRI's +# Python 1.6 license. For any other use, please contact Secret Labs +# AB (info@pythonware.com). +# +# Portions of this engine have been developed in cooperation with +# CNRI. Hewlett-Packard provided funding for 1.6 integration and +# other compatibility work. +# + +r"""Support for regular expressions (RE). + +This module provides regular expression matching operations similar to +those found in Perl. It supports both 8-bit and Unicode strings; both +the pattern and the strings being processed can contain null bytes and +characters outside the US ASCII range. + +Regular expressions can contain both special and ordinary characters. +Most ordinary characters, like "A", "a", or "0", are the simplest +regular expressions; they simply match themselves. You can +concatenate ordinary characters, so last matches the string 'last'. + +The special characters are: + "." Matches any character except a newline. + "^" Matches the start of the string. + "$" Matches the end of the string or just before the newline at + the end of the string. + "*" Matches 0 or more (greedy) repetitions of the preceding RE. + Greedy means that it will match as many repetitions as possible. + "+" Matches 1 or more (greedy) repetitions of the preceding RE. + "?" Matches 0 or 1 (greedy) of the preceding RE. + *?,+?,?? Non-greedy versions of the previous three special characters. + {m,n} Matches from m to n repetitions of the preceding RE. + {m,n}? Non-greedy version of the above. + "\\" Either escapes special characters or signals a special sequence. + [] Indicates a set of characters. + A "^" as the first character indicates a complementing set. + "|" A|B, creates an RE that will match either A or B. + (...) Matches the RE inside the parentheses. + The contents can be retrieved or matched later in the string. + (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below). + (?:...) Non-grouping version of regular parentheses. + (?P...) The substring matched by the group is accessible by name. + (?P=name) Matches the text matched earlier by the group named name. + (?#...) A comment; ignored. + (?=...) Matches if ... matches next, but doesn't consume the string. + (?!...) Matches if ... doesn't match next. + (?<=...) Matches if preceded by ... (must be fixed length). + (?= _MAXCACHE: + _cache.clear() + if p.flags & LOCALE: + if not _locale: + return p + loc = _locale.setlocale(_locale.LC_CTYPE) + else: + loc = None + _cache[type(pattern), pattern, flags] = p, loc + return p + +@functools.lru_cache(_MAXCACHE) +def _compile_repl(repl, pattern): + # internal: compile replacement pattern + return sre_parse.parse_template(repl, pattern) + +def _expand(pattern, match, template): + # internal: match.expand implementation hook + template = sre_parse.parse_template(template, pattern) + return sre_parse.expand_template(template, match) + +def _subx(pattern, template): + # internal: pattern.sub/subn implementation helper + template = _compile_repl(template, pattern) + if not template[0] and len(template[1]) == 1: + # literal replacement + return template[1][0] + def filter(match, template=template): + return sre_parse.expand_template(template, match) + return filter + +# register myself for pickling + +import copyreg + +def _pickle(p): + return _compile, (p.pattern, p.flags) + +copyreg.pickle(_pattern_type, _pickle, _compile) + +# -------------------------------------------------------------------- +# experimental stuff (see python-dev discussions for details) + +class Scanner: + def __init__(self, lexicon, flags=0): + from sre_constants import BRANCH, SUBPATTERN + self.lexicon = lexicon + # combine phrases into a compound pattern + p = [] + s = sre_parse.Pattern() + s.flags = flags + for phrase, action in lexicon: + gid = s.opengroup() + p.append(sre_parse.SubPattern(s, [ + (SUBPATTERN, (gid, 0, 0, sre_parse.parse(phrase, flags))), + ])) + s.closegroup(gid, p[-1]) + p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) + self.scanner = sre_compile.compile(p) + def scan(self, string): + result = [] + append = result.append + match = self.scanner.scanner(string).match + i = 0 + while True: + m = match() + if not m: + break + j = m.end() + if i == j: + break + action = self.lexicon[m.lastindex-1][1] + if callable(action): + self.match = m + action = action(self, m.group()) + if action is not None: + append(action) + i = j + return result, string[i:] diff --git a/flaskwebproject/FlaskWebProject1/Lib/reprlib.py b/flaskwebproject/FlaskWebProject1/Lib/reprlib.py new file mode 100644 index 0000000..40d991f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/reprlib.py @@ -0,0 +1,164 @@ +"""Redo the builtin repr() (representation) but with limits on most sizes.""" + +__all__ = ["Repr", "repr", "recursive_repr"] + +import builtins +from itertools import islice +try: + from _thread import get_ident +except ImportError: + from _dummy_thread import get_ident + +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.__qualname__ = getattr(user_function, '__qualname__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + +class Repr: + + def __init__(self): + self.maxlevel = 6 + self.maxtuple = 6 + self.maxlist = 6 + self.maxarray = 5 + self.maxdict = 4 + self.maxset = 6 + self.maxfrozenset = 6 + self.maxdeque = 6 + self.maxstring = 30 + self.maxlong = 40 + self.maxother = 30 + + def repr(self, x): + return self.repr1(x, self.maxlevel) + + def repr1(self, x, level): + typename = type(x).__name__ + if ' ' in typename: + parts = typename.split() + typename = '_'.join(parts) + if hasattr(self, 'repr_' + typename): + return getattr(self, 'repr_' + typename)(x, level) + else: + return self.repr_instance(x, level) + + def _repr_iterable(self, x, level, left, right, maxiter, trail=''): + n = len(x) + if level <= 0 and n: + s = '...' + else: + newlevel = level - 1 + repr1 = self.repr1 + pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)] + if n > maxiter: pieces.append('...') + s = ', '.join(pieces) + if n == 1 and trail: right = trail + right + return '%s%s%s' % (left, s, right) + + def repr_tuple(self, x, level): + return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',') + + def repr_list(self, x, level): + return self._repr_iterable(x, level, '[', ']', self.maxlist) + + def repr_array(self, x, level): + if not x: + return "array('%s')" % x.typecode + header = "array('%s', [" % x.typecode + return self._repr_iterable(x, level, header, '])', self.maxarray) + + def repr_set(self, x, level): + if not x: + return 'set()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, '{', '}', self.maxset) + + def repr_frozenset(self, x, level): + if not x: + return 'frozenset()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, 'frozenset({', '})', + self.maxfrozenset) + + def repr_deque(self, x, level): + return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque) + + def repr_dict(self, x, level): + n = len(x) + if n == 0: return '{}' + if level <= 0: return '{...}' + newlevel = level - 1 + repr1 = self.repr1 + pieces = [] + for key in islice(_possibly_sorted(x), self.maxdict): + keyrepr = repr1(key, newlevel) + valrepr = repr1(x[key], newlevel) + pieces.append('%s: %s' % (keyrepr, valrepr)) + if n > self.maxdict: pieces.append('...') + s = ', '.join(pieces) + return '{%s}' % (s,) + + def repr_str(self, x, level): + s = builtins.repr(x[:self.maxstring]) + if len(s) > self.maxstring: + i = max(0, (self.maxstring-3)//2) + j = max(0, self.maxstring-3-i) + s = builtins.repr(x[:i] + x[len(x)-j:]) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_int(self, x, level): + s = builtins.repr(x) # XXX Hope this isn't too slow... + if len(s) > self.maxlong: + i = max(0, (self.maxlong-3)//2) + j = max(0, self.maxlong-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_instance(self, x, level): + try: + s = builtins.repr(x) + # Bugs in x.__repr__() can cause arbitrary + # exceptions -- then make up something + except Exception: + return '<%s instance at %#x>' % (x.__class__.__name__, id(x)) + if len(s) > self.maxother: + i = max(0, (self.maxother-3)//2) + j = max(0, self.maxother-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + +def _possibly_sorted(x): + # Since not all sequences of items can be sorted and comparison + # functions may raise arbitrary exceptions, return an unsorted + # sequence in that case. + try: + return sorted(x) + except Exception: + return list(x) + +aRepr = Repr() +repr = aRepr.repr diff --git a/flaskwebproject/FlaskWebProject1/Lib/rlcompleter.py b/flaskwebproject/FlaskWebProject1/Lib/rlcompleter.py new file mode 100644 index 0000000..bca4a7b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/rlcompleter.py @@ -0,0 +1,205 @@ +"""Word completion for GNU readline. + +The completer completes keywords, built-ins and globals in a selectable +namespace (which defaults to __main__); when completing NAME.NAME..., it +evaluates (!) the expression up to the last dot and completes its attributes. + +It's very cool to do "import sys" type "sys.", hit the completion key (twice), +and see the list of names defined by the sys module! + +Tip: to use the tab key as the completion key, call + + readline.parse_and_bind("tab: complete") + +Notes: + +- Exceptions raised by the completer function are *ignored* (and generally cause + the completion to fail). This is a feature -- since readline sets the tty + device in raw (or cbreak) mode, printing a traceback wouldn't work well + without some complicated hoopla to save, reset and restore the tty state. + +- The evaluation of the NAME.NAME... form may cause arbitrary application + defined code to be executed if an object with a __getattr__ hook is found. + Since it is the responsibility of the application (or the user) to enable this + feature, I consider this an acceptable risk. More complicated expressions + (e.g. function calls or indexing operations) are *not* evaluated. + +- When the original stdin is not a tty device, GNU readline is never + used, and this module (and the readline module) are silently inactive. + +""" + +import atexit +import builtins +import __main__ + +__all__ = ["Completer"] + +class Completer: + def __init__(self, namespace = None): + """Create a new completer for the command line. + + Completer([namespace]) -> completer instance. + + If unspecified, the default namespace where completions are performed + is __main__ (technically, __main__.__dict__). Namespaces should be + given as dictionaries. + + Completer instances should be used as the completion mechanism of + readline via the set_completer() call: + + readline.set_completer(Completer(my_namespace).complete) + """ + + if namespace and not isinstance(namespace, dict): + raise TypeError('namespace must be a dictionary') + + # Don't bind to namespace quite yet, but flag whether the user wants a + # specific namespace or to use __main__.__dict__. This will allow us + # to bind to __main__.__dict__ at completion time, not now. + if namespace is None: + self.use_main_ns = 1 + else: + self.use_main_ns = 0 + self.namespace = namespace + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if self.use_main_ns: + self.namespace = __main__.__dict__ + + if not text.strip(): + if state == 0: + if _readline_available: + readline.insert_text('\t') + readline.redisplay() + return '' + else: + return '\t' + else: + return None + + if state == 0: + if "." in text: + self.matches = self.attr_matches(text) + else: + self.matches = self.global_matches(text) + try: + return self.matches[state] + except IndexError: + return None + + def _callable_postfix(self, val, word): + if callable(val): + word = word + "(" + return word + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names currently + defined in self.namespace that match. + + """ + import keyword + matches = [] + seen = {"__builtins__"} + n = len(text) + for word in keyword.kwlist: + if word[:n] == text: + seen.add(word) + if word in {'finally', 'try'}: + word = word + ':' + elif word not in {'False', 'None', 'True', + 'break', 'continue', 'pass', + 'else'}: + word = word + ' ' + matches.append(word) + for nspace in [self.namespace, builtins.__dict__]: + for word, val in nspace.items(): + if word[:n] == text and word not in seen: + seen.add(word) + matches.append(self._callable_postfix(val, word)) + return matches + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluable in self.namespace, it will be evaluated and its attributes + (as revealed by dir()) are used as possible completions. (For class + instances, class members are also considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + import re + m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) + if not m: + return [] + expr, attr = m.group(1, 3) + try: + thisobject = eval(expr, self.namespace) + except Exception: + return [] + + # get the content of the object, except __builtins__ + words = set(dir(thisobject)) + words.discard("__builtins__") + + if hasattr(thisobject, '__class__'): + words.add('__class__') + words.update(get_class_members(thisobject.__class__)) + matches = [] + n = len(attr) + if attr == '': + noprefix = '_' + elif attr == '_': + noprefix = '__' + else: + noprefix = None + while True: + for word in words: + if (word[:n] == attr and + not (noprefix and word[:n+1] == noprefix)): + match = "%s.%s" % (expr, word) + try: + val = getattr(thisobject, word) + except Exception: + pass # Include even if attribute not set + else: + match = self._callable_postfix(val, match) + matches.append(match) + if matches or not noprefix: + break + if noprefix == '_': + noprefix = '__' + else: + noprefix = None + matches.sort() + return matches + +def get_class_members(klass): + ret = dir(klass) + if hasattr(klass,'__bases__'): + for base in klass.__bases__: + ret = ret + get_class_members(base) + return ret + +try: + import readline +except ImportError: + _readline_available = False +else: + readline.set_completer(Completer().complete) + # Release references early at shutdown (the readline module's + # contents are quasi-immortal, and the completer function holds a + # reference to globals). + atexit.register(lambda: readline.set_completer(None)) + _readline_available = True diff --git a/flaskwebproject/FlaskWebProject1/Lib/shutil.py b/flaskwebproject/FlaskWebProject1/Lib/shutil.py new file mode 100644 index 0000000..bd4760f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/shutil.py @@ -0,0 +1,1153 @@ +"""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 +import fnmatch +import collections +import errno + +try: + import zlib + del zlib + _ZLIB_SUPPORTED = True +except ImportError: + _ZLIB_SUPPORTED = False + +try: + import bz2 + del bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + import lzma + del lzma + _LZMA_SUPPORTED = True +except ImportError: + _LZMA_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", "chown", "which", "get_terminal_size", + "SameFileError"] + # disk_usage is added later, if available on the platform + +class Error(OSError): + pass + +class SameFileError(Error): + """Raised when source and destination are the same file.""" + +class SpecialFileError(OSError): + """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(OSError): + """Raised when a command could not be executed""" + +class ReadError(OSError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +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, *, follow_symlinks=True): + """Copy data from src to dst. + + If follow_symlinks is not set and src is a symbolic link, a new + symlink will be created instead of copying the file it points to. + + """ + if _samefile(src, dst): + raise SameFileError("{!r} and {!r} are the same file".format(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) + + if not follow_symlinks and os.path.islink(src): + os.symlink(os.readlink(src), dst) + else: + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + return dst + +def copymode(src, dst, *, follow_symlinks=True): + """Copy mode bits from src to dst. + + If follow_symlinks is not set, symlinks aren't followed if and only + if both `src` and `dst` are symlinks. If `lchmod` isn't available + (e.g. Linux) this method does nothing. + + """ + if not follow_symlinks and os.path.islink(src) and os.path.islink(dst): + if hasattr(os, 'lchmod'): + stat_func, chmod_func = os.lstat, os.lchmod + else: + return + elif hasattr(os, 'chmod'): + stat_func, chmod_func = os.stat, os.chmod + else: + return + + st = stat_func(src) + chmod_func(dst, stat.S_IMODE(st.st_mode)) + +if hasattr(os, 'listxattr'): + def _copyxattr(src, dst, *, follow_symlinks=True): + """Copy extended filesystem attributes from `src` to `dst`. + + Overwrite existing attributes. + + If `follow_symlinks` is false, symlinks won't be followed. + + """ + + try: + names = os.listxattr(src, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.ENOTSUP, errno.ENODATA): + raise + return + for name in names: + try: + value = os.getxattr(src, name, follow_symlinks=follow_symlinks) + os.setxattr(dst, name, value, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA): + raise +else: + def _copyxattr(*args, **kwargs): + pass + +def copystat(src, dst, *, follow_symlinks=True): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst. + + If the optional flag `follow_symlinks` is not set, symlinks aren't followed if and + only if both `src` and `dst` are symlinks. + + """ + def _nop(*args, ns=None, follow_symlinks=None): + pass + + # follow symlinks (aka don't not follow symlinks) + follow = follow_symlinks or not (os.path.islink(src) and os.path.islink(dst)) + if follow: + # use the real function if it exists + def lookup(name): + return getattr(os, name, _nop) + else: + # use the real function only if it exists + # *and* it supports follow_symlinks + def lookup(name): + fn = getattr(os, name, _nop) + if fn in os.supports_follow_symlinks: + return fn + return _nop + + st = lookup("stat")(src, follow_symlinks=follow) + mode = stat.S_IMODE(st.st_mode) + lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns), + follow_symlinks=follow) + try: + lookup("chmod")(dst, mode, follow_symlinks=follow) + except NotImplementedError: + # if we got a NotImplementedError, it's because + # * follow_symlinks=False, + # * lchown() is unavailable, and + # * either + # * fchownat() is unavailable or + # * fchownat() doesn't implement AT_SYMLINK_NOFOLLOW. + # (it returned ENOSUP.) + # therefore we're out of options--we simply cannot chown the + # symlink. give up, suppress the error. + # (which is what shutil always did in this circumstance.) + pass + if hasattr(st, 'st_flags'): + try: + lookup("chflags")(dst, st.st_flags, follow_symlinks=follow) + except OSError as why: + for err in 'EOPNOTSUPP', 'ENOTSUP': + if hasattr(errno, err) and why.errno == getattr(errno, err): + break + else: + raise + _copyxattr(src, dst, follow_symlinks=follow) + +def copy(src, dst, *, follow_symlinks=True): + """Copy data and mode bits ("cp src dst"). Return the file's destination. + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + If source and destination are the same file, a SameFileError will be + raised. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copymode(src, dst, follow_symlinks=follow_symlinks) + return dst + +def copy2(src, dst, *, follow_symlinks=True): + """Copy data and all stat info ("cp -p src dst"). Return the file's + destination." + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copystat(src, dst, follow_symlinks=follow_symlinks) + return 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: + # We can't just leave it to `copy_function` because legacy + # code with a custom `copy_function` may rely on copytree + # doing the right thing. + os.symlink(linkto, dstname) + copystat(srcname, dstname, follow_symlinks=not symlinks) + 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 + if os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, + copy_function) + else: + 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 OSError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + # Copying file access times may fail on Windows + if getattr(why, 'winerror', None) is None: + errors.append((src, dst, str(why))) + if errors: + raise Error(errors) + return dst + +# version vulnerable to race conditions +def _rmtree_unsafe(path, onerror): + 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 OSError: + 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 OSError: + mode = 0 + if stat.S_ISDIR(mode): + _rmtree_unsafe(fullname, onerror) + else: + try: + os.unlink(fullname) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + +# Version using fd-based APIs to protect against races +def _rmtree_safe_fd(topfd, path, onerror): + names = [] + try: + names = os.listdir(topfd) + except OSError as err: + err.filename = path + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + orig_st = os.stat(name, dir_fd=topfd, follow_symlinks=False) + mode = orig_st.st_mode + except OSError: + mode = 0 + if stat.S_ISDIR(mode): + try: + dirfd = os.open(name, os.O_RDONLY, dir_fd=topfd) + except OSError: + onerror(os.open, fullname, sys.exc_info()) + else: + try: + if os.path.samestat(orig_st, os.fstat(dirfd)): + _rmtree_safe_fd(dirfd, fullname, onerror) + try: + os.rmdir(name, dir_fd=topfd) + except OSError: + onerror(os.rmdir, fullname, sys.exc_info()) + else: + try: + # This can only happen if someone replaces + # a directory with a symlink after the call to + # stat.S_ISDIR above. + raise OSError("Cannot call rmtree on a symbolic " + "link") + except OSError: + onerror(os.path.islink, fullname, sys.exc_info()) + finally: + os.close(dirfd) + else: + try: + os.unlink(name, dir_fd=topfd) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + +_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.listdir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + +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 platform and implementation dependent; + 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 + if _use_fd_functions: + # While the unsafe rmtree works fine on bytes, the fd based does not. + if isinstance(path, bytes): + path = os.fsdecode(path) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + try: + orig_st = os.lstat(path) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + fd = os.open(path, os.O_RDONLY) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + if os.path.samestat(orig_st, os.fstat(fd)): + _rmtree_safe_fd(fd, path, onerror) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + else: + try: + # 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()) + finally: + os.close(fd) + else: + return _rmtree_unsafe(path, onerror) + +# Allow introspection of whether or not the hardening against symlink +# attacks is supported on the current platform +rmtree.avoids_symlink_attacks = _use_fd_functions + +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. + sep = os.path.sep + (os.path.altsep or '') + return os.path.basename(path.rstrip(sep)) + +def move(src, dst, copy_function=copy2): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. Return the file or directory's + destination. + + 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. Symlinks are + recreated under the new name if os.rename() fails because of cross + filesystem renames. + + The optional `copy_function` argument is a callable that will be used + to copy the source or it will be delegated to `copytree`. + By default, copy2() is used, but any function that supports the same + signature (like copy()) can be used. + + 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.islink(src): + linkto = os.readlink(src) + os.symlink(linkto, real_dst) + os.unlink(src) + elif os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself" + " '%s'." % (src, dst)) + copytree(src, real_dst, copy_function=copy_function, + symlinks=True) + rmtree(src) + else: + copy_function(src, real_dst) + os.unlink(src) + return real_dst + +def _destinsrc(src, dst): + src = os.path.abspath(src) + dst = os.path.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", "xz", 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", ".bz2", or ".xz"). + + Returns the output filename. + """ + if compress is None: + tar_compression = '' + elif _ZLIB_SUPPORTED and compress == 'gzip': + tar_compression = 'gz' + elif _BZ2_SUPPORTED and compress == 'bzip2': + tar_compression = 'bz2' + elif _LZMA_SUPPORTED and compress == 'xz': + tar_compression = 'xz' + else: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + import tarfile # late import for breaking circular dependency + + compress_ext = '.' + tar_compression if compress else '' + archive_name = base_name + '.tar' + compress_ext + archive_dir = os.path.dirname(archive_name) + + if archive_dir and 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) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +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". Returns the + name of the output zip file. + """ + import zipfile # late import for breaking circular dependency + + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if archive_dir and 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 logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + with zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) as zf: + path = os.path.normpath(base_dir) + if path != os.curdir: + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in sorted(dirnames): + path = os.path.normpath(os.path.join(dirpath, name)) + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + + return zip_filename + +_ARCHIVE_FORMATS = { + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), +} + +if _ZLIB_SUPPORTED: + _ARCHIVE_FORMATS['gztar'] = (_make_tarball, [('compress', 'gzip')], + "gzip'ed tar-file") + _ARCHIVE_FORMATS['zip'] = (_make_zipfile, [], "ZIP file") + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _ARCHIVE_FORMATS['xztar'] = (_make_tarball, [('compress', 'xz')], + "xz'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 callable(function): + 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", "gztar", + "bztar", or "xztar". Or any other registered format. + + '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 callable(function): + 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` + """ + import zipfile # late import for breaking circular dependency + + 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/tar.xz `filename` to `extract_dir` + """ + import tarfile # late import for breaking circular dependency + 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 = { + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file"), +} + +if _ZLIB_SUPPORTED: + _UNPACK_FORMATS['gztar'] = (['.tar.gz', '.tgz'], _unpack_tarfile, [], + "gzip'ed tar-file") + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.tar.bz2', '.tbz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _UNPACK_FORMATS['xztar'] = (['.tar.xz', '.txz'], _unpack_tarfile, [], + "xz'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", "gztar", "bztar", + or "xztar". 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) + + +if hasattr(os, 'statvfs'): + + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + _ntuple_diskusage.total.__doc__ = 'Total space in bytes' + _ntuple_diskusage.used.__doc__ = 'Used space in bytes' + _ntuple_diskusage.free.__doc__ = 'Free space in bytes' + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned value is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + st = os.statvfs(path) + free = st.f_bavail * st.f_frsize + total = st.f_blocks * st.f_frsize + used = (st.f_blocks - st.f_bfree) * st.f_frsize + return _ntuple_diskusage(total, used, free) + +elif os.name == 'nt': + + import nt + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned values is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + total, free = nt._getdiskusage(path) + used = total - free + return _ntuple_diskusage(total, used, free) + + +def chown(path, user=None, group=None): + """Change owner user and group of the given path. + + user and group can be the uid/gid or the user/group names, and in that case, + they are converted to their respective uid/gid. + """ + + if user is None and group is None: + raise ValueError("user and/or group must be set") + + _user = user + _group = group + + # -1 means don't change it + if user is None: + _user = -1 + # user can either be an int (the uid) or a string (the system username) + elif isinstance(user, str): + _user = _get_uid(user) + if _user is None: + raise LookupError("no such user: {!r}".format(user)) + + if group is None: + _group = -1 + elif not isinstance(group, int): + _group = _get_gid(group) + if _group is None: + raise LookupError("no such group: {!r}".format(group)) + + os.chown(path, _user, _group) + +def get_terminal_size(fallback=(80, 24)): + """Get the size of the terminal window. + + For each of the two dimensions, the environment variable, COLUMNS + and LINES respectively, is checked. If the variable is defined and + the value is a positive integer, it is used. + + When COLUMNS or LINES is not defined, which is the common case, + the terminal connected to sys.__stdout__ is queried + by invoking os.get_terminal_size. + + If the terminal size cannot be successfully queried, either because + the system doesn't support querying, or because we are not + connected to a terminal, the value given in fallback parameter + is used. Fallback defaults to (80, 24) which is the default + size used by many terminal emulators. + + The value returned is a named tuple of type os.terminal_size. + """ + # columns, lines are the working values + try: + columns = int(os.environ['COLUMNS']) + except (KeyError, ValueError): + columns = 0 + + try: + lines = int(os.environ['LINES']) + except (KeyError, ValueError): + lines = 0 + + # only query if necessary + if columns <= 0 or lines <= 0: + try: + size = os.get_terminal_size(sys.__stdout__.fileno()) + except (AttributeError, ValueError, OSError): + # stdout is None, closed, detached, or not a terminal, or + # os.get_terminal_size() is unsupported + size = os.terminal_size(fallback) + if columns <= 0: + columns = size.columns + if lines <= 0: + lines = size.lines + + return os.terminal_size((columns, lines)) + +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 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/easy_install.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/INSTALLER b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..d3379fa --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2018 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. diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/METADATA b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/METADATA new file mode 100644 index 0000000..2e314aa --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/METADATA @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: pip +Version: 18.1 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +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: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +pip +=== + +The `PyPA recommended`_ tool for installing Python packages. + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg?label=travis-ci + :target: https://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg?label=appveyor-ci + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +* `Installation`_ +* `Documentation`_ +* `Changelog`_ +* `GitHub Page`_ +* `Issue Tracking`_ +* `User mailing list`_ +* `Dev mailing list`_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + +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`_. + +.. _PyPA recommended: https://packaging.python.org/en/latest/current/ +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Documentation: https://pip.pypa.io/en/stable/ +.. _Changelog: https://pip.pypa.io/en/stable/news.html +.. _GitHub Page: https://github.com/pypa/pip +.. _Issue Tracking: https://github.com/pypa/pip/issues +.. _User mailing list: https://groups.google.com/forum/#!forum/python-virtualenv +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/RECORD b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/RECORD new file mode 100644 index 0000000..519ff0a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/RECORD @@ -0,0 +1,614 @@ +../../Scripts/pip.exe,sha256=O_NhMEouKDGlJW4OUhWF2jtCSBRTUdw1HOSydicXMkY,102820 +../../Scripts/pip3.6.exe,sha256=O_NhMEouKDGlJW4OUhWF2jtCSBRTUdw1HOSydicXMkY,102820 +../../Scripts/pip3.exe,sha256=O_NhMEouKDGlJW4OUhWF2jtCSBRTUdw1HOSydicXMkY,102820 +pip-18.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-18.1.dist-info/LICENSE.txt,sha256=ORqHhOMZ2uVDFHfUzJvFBPxdcf2eieHIDxzThV9dfPo,1090 +pip-18.1.dist-info/METADATA,sha256=D7pqBJTuqM9w_HTW91a0XGjLT9vynlBAE4pPCt_W_UE,2588 +pip-18.1.dist-info/RECORD,, +pip-18.1.dist-info/WHEEL,sha256=8T8fxefr_r-A79qbOJ9d_AaEgkpCGmEPHc-gpCq5BRg,110 +pip-18.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 +pip-18.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=nO-iphoXiDoci_ZAMl-PG2zdd4Y7m88jBDILTYzwGy4,21 +pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 +pip/__pycache__/__init__.cpython-36.pyc,, +pip/__pycache__/__main__.cpython-36.pyc,, +pip/_internal/__init__.py,sha256=b0jSFCCViGhB1RWni35_NMkH3Y-mbZrV648DGMagDjs,2869 +pip/_internal/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/__pycache__/build_env.cpython-36.pyc,, +pip/_internal/__pycache__/cache.cpython-36.pyc,, +pip/_internal/__pycache__/configuration.cpython-36.pyc,, +pip/_internal/__pycache__/download.cpython-36.pyc,, +pip/_internal/__pycache__/exceptions.cpython-36.pyc,, +pip/_internal/__pycache__/index.cpython-36.pyc,, +pip/_internal/__pycache__/locations.cpython-36.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-36.pyc,, +pip/_internal/__pycache__/pyproject.cpython-36.pyc,, +pip/_internal/__pycache__/resolve.cpython-36.pyc,, +pip/_internal/__pycache__/wheel.cpython-36.pyc,, +pip/_internal/build_env.py,sha256=zKhqmDMnrX5OTSNQ4xBw-mN5mTGVu6wjiNFW-ajWYEI,4797 +pip/_internal/cache.py,sha256=96_aKtDbwgLEVNgNabOT8GrFCYZEACedoiucqU5ccg8,6829 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-36.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-36.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 +pip/_internal/cli/base_command.py,sha256=ke6af4iWzrZoc3HtiPKnCZJvD6GlX8dRwBwpFCg1axc,9963 +pip/_internal/cli/cmdoptions.py,sha256=WoPPY1uHsDjA_NvZek8Mko38rxraD3pX8eZUkNKvk10,19468 +pip/_internal/cli/main_parser.py,sha256=Ga_kT7if-Gg0rmmRqlGEHW6JWVm9zwzO7igJm6RE9EI,2763 +pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/commands/__init__.py,sha256=CQAzhVx9ViPtqLNUvAeqnKj5iWfFEcqMx5RlZWjJ30c,2251 +pip/_internal/commands/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/commands/__pycache__/check.cpython-36.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-36.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-36.pyc,, +pip/_internal/commands/__pycache__/download.cpython-36.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-36.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-36.pyc,, +pip/_internal/commands/__pycache__/help.cpython-36.pyc,, +pip/_internal/commands/__pycache__/install.cpython-36.pyc,, +pip/_internal/commands/__pycache__/list.cpython-36.pyc,, +pip/_internal/commands/__pycache__/search.cpython-36.pyc,, +pip/_internal/commands/__pycache__/show.cpython-36.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-36.pyc,, +pip/_internal/commands/check.py,sha256=CyeYH2kfDKSGSURoBfWtx-sTcZZQP-bK170NmKYlmsg,1398 +pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 +pip/_internal/commands/configuration.py,sha256=265HWuUxPggCNcIeWHA3p-LDDiRVnexwFgwmHGgWOHY,7125 +pip/_internal/commands/download.py,sha256=D_iGMp3xX2iD7KZYZAjXlYT3rf3xjwxyYe05KE-DVzE,6514 +pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 +pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 +pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 +pip/_internal/commands/install.py,sha256=tKyzfo5bhDGLVTTQCQJ9PFnDjimQvEWnwIAI2XHpaac,21039 +pip/_internal/commands/list.py,sha256=n740MsR0cG34EuvGWMzdVl0uIA3UIYx1_95FUsTktN0,10272 +pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 +pip/_internal/commands/show.py,sha256=9EVh86vY0NZdlhT-wsuV-zq_MAV6qqV4S1Akn3wkUuw,6289 +pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 +pip/_internal/commands/wheel.py,sha256=ZuVf_DMpKCUzBVstolvQPAeajQRC51Oky5_hDHzhhFs,7020 +pip/_internal/configuration.py,sha256=KMgG3ufFrUKX_QESi2cMVvFi47tl845Bg1ZkNthlWik,13243 +pip/_internal/download.py,sha256=c5Hkimq39eJdZ6DN0_0etjK43-0a5CK_W_3sVLqH87g,33300 +pip/_internal/exceptions.py,sha256=EIGotnq6qM2nbGtnlgZ8Xp5VfP2W4-9UOCzQGMwy5MY,8899 +pip/_internal/index.py,sha256=6CAtZ8QTLcpw0fJqQ9OPu-Os1ettLZtVY1pPSKia8r8,34789 +pip/_internal/locations.py,sha256=ujNrLnA04Y_EmSriO0nS6qkkw_BkPfobB_hdwIDPvpM,6307 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-36.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-36.pyc,, +pip/_internal/models/__pycache__/index.cpython-36.pyc,, +pip/_internal/models/__pycache__/link.cpython-36.pyc,, +pip/_internal/models/candidate.py,sha256=zq2Vb5l5JflrVX7smHTJHQciZWHyoJZuYTLeQa1G16c,741 +pip/_internal/models/format_control.py,sha256=aDbH4D2XuyaGjtRjTLQhNzClAcLZdJCKSHO8xbZSmFA,2202 +pip/_internal/models/index.py,sha256=YI1WlhWfS9mVPY0bIboA5la2pjJ2J0qgPJIbvdEjZBk,996 +pip/_internal/models/link.py,sha256=E61PvS2Wrmb9-zT-eAc_8_xI3C-89wJlpL8SL-mlQmg,3998 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/operations/__pycache__/check.cpython-36.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-36.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-36.pyc,, +pip/_internal/operations/check.py,sha256=ahcOg5p68nNow6_wy5prYYK0KZq22lm0CsJn8AyDMCI,4937 +pip/_internal/operations/freeze.py,sha256=lskaBcqf3bPZupG032fuLf76QYv5wpAQ6jsiXac56Bg,10450 +pip/_internal/operations/prepare.py,sha256=atoLFj3OD5KfXsa5dYBMC_mI06l068F5yZhF4jle1JA,14280 +pip/_internal/pep425tags.py,sha256=TQhxOPss4RjxgyVgxpSRe31HaTcWmn-LVjWBbkvkjzk,10845 +pip/_internal/pyproject.py,sha256=fpO52MCa3w5xSlXIBXw39BDTGzP8G4570EW34hVvIKQ,5481 +pip/_internal/req/__init__.py,sha256=JnNZWvKUQuqAwHh64LCD3zprzWIVQEXChTo2UGHzVqo,2093 +pip/_internal/req/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc,, +pip/_internal/req/constructors.py,sha256=97WQp9Svh-Jw3oLZL9_57gJ3zihm5LnWlSRjOwOorDU,9573 +pip/_internal/req/req_file.py,sha256=ORA0GKUjGd6vy7pmBwXR55FFj4h_OxYykFQ6gHuWvt0,11940 +pip/_internal/req/req_install.py,sha256=ry1RtNNCefDHAnf3EeGMpea-9pC6Yk1uHzP0Q5p2Un0,34046 +pip/_internal/req/req_set.py,sha256=nE6oagXJSiQREuuebX3oJO5OHSOVUIlvLLilodetBzc,7264 +pip/_internal/req/req_tracker.py,sha256=zH28YHV5TXAVh1ZOEZi6Z1Edkiu26dN2tXfR6VbQ3B4,2370 +pip/_internal/req/req_uninstall.py,sha256=ORSPah64KOVrKo-InMM3zgS5HQqbl5TLHFnE_Lxstq8,16737 +pip/_internal/resolve.py,sha256=tdepxCewsXXNFKSIYGSxiLvzi1xCv7UVFT9jRCDO90A,13578 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-36.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-36.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-36.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-36.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-36.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-36.pyc,, +pip/_internal/utils/__pycache__/models.cpython-36.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-36.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-36.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-36.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-36.pyc,, +pip/_internal/utils/appdirs.py,sha256=SPfibHtvOKzD_sHrpEZ60HfLae3GharU4Tg7SB3c-XM,9120 +pip/_internal/utils/compat.py,sha256=LSAvzXcsGY2O2drKIPszR5Ja2G0kup__51l3bx1jR_Q,8015 +pip/_internal/utils/deprecation.py,sha256=yQTe6dyWlBfxSBrOv_MdRXF1RPLER_EWOp-pa2zLoZc,3021 +pip/_internal/utils/encoding.py,sha256=D8tmfStCah6xh9OLhH9mWLr77q4akhg580YHJMKpq3Y,1025 +pip/_internal/utils/filesystem.py,sha256=ZOIHbacJ-SJtuZru4GoA5DuSIYyeaE4G5kfZPf5cn1A,915 +pip/_internal/utils/glibc.py,sha256=prOrsBjmgkDE-hY4Pl120yF5MIlkkmGrFLs8XfIyT-w,3004 +pip/_internal/utils/hashes.py,sha256=rJk-gj6F-sHggXAG97dhynqUHFFgApyZLWgaG2xCHME,2900 +pip/_internal/utils/logging.py,sha256=BQeUDEER3zlK0O4yv6DBfz6TK3f9XoLXyDlnB0mZVf0,6295 +pip/_internal/utils/misc.py,sha256=YscDfBiFx1spYOtSgdI_5hnc5BZUysWAyz1aVL5y-48,29904 +pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 +pip/_internal/utils/outdated.py,sha256=BXtCMKR6gjTrvMfP3MWzZ1Y4ZU4qqoCfbRNqQCusVt8,5642 +pip/_internal/utils/packaging.py,sha256=Ru8ls_S8PPKR8RKEn7jMetENY_A9jPet1HlhTZwpFxU,2443 +pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/_internal/utils/temp_dir.py,sha256=n2FkVlwRX_hS61fYt3nSAh2e2V6CcZn_dfbPId1pAQE,2615 +pip/_internal/utils/typing.py,sha256=ztYtZAcqjCYDwP-WlF6EiAAskAsZBMMXtuqvfgZIlgQ,1139 +pip/_internal/utils/ui.py,sha256=FW8wdtc7DvNwJClGr_TvGZlqcoO482GYe0UY9nKmpso,13657 +pip/_internal/vcs/__init__.py,sha256=2Ct9ogOwzS6ZKKaEXKN2XDiBOiFHMcejnN1KM21mLrQ,16319 +pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc,, +pip/_internal/vcs/bazaar.py,sha256=rjskVmSSn68O7lC5JrGmDTWXneXFMMJJvj_bbdSM8QA,3669 +pip/_internal/vcs/git.py,sha256=n1cFBqTnLIcxAOClZMgOBqELjEjygDBPZ9z-Q7g0qVQ,12580 +pip/_internal/vcs/mercurial.py,sha256=jVTa0XQpFR6EiBcaqW4E4JjTce_t1tFnKRaIhaIPlS8,3471 +pip/_internal/vcs/subversion.py,sha256=vDLTfcjj0kgqcEsbPBfveC4CRxyhWiOjke-qN0Zr8CE,7676 +pip/_internal/wheel.py,sha256=fg9E936DaI1LyrBPHqtzHG_WEVyuUwipHISkD6N3jNw,32007 +pip/_vendor/__init__.py,sha256=XnhkujjE1qUGRlYGYbIRrEGYYYBcNLBraE27HH48wYw,4756 +pip/_vendor/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pip/_vendor/__pycache__/distro.cpython-36.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-36.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pip/_vendor/__pycache__/retrying.cpython-36.pyc,, +pip/_vendor/__pycache__/six.cpython-36.pyc,, +pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 +pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 +pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 +pip/_vendor/certifi/__init__.py,sha256=5lCYV1iWxoirX1OAaSHkBYUuZGdcwEjEBS6DS_trL0s,63 +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-36.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=XA-4HVBsOrBD5lfg-b3PiUzAvwUd2qlIzwXypIMIRGM,263074 +pip/_vendor/certifi/core.py,sha256=xPQDdG_siy5A7BfqGWa7RJhcA61xXEqPiSrw9GNyhHE,836 +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-36.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/colorama/__init__.py,sha256=V3-Hv_vOa-2lE5Q_0mGkdhZo-9e4XrGTW_44cU81qQY,240 +pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansitowin32.py,sha256=QrieYX2tsaWIO19P6biMa1zUCt-_abudoEp2_IdqZZU,9668 +pip/_vendor/colorama/initialise.py,sha256=cHqVJtb82OG7HUCxvQ2joG7N_CoxbIKbI_fgryZkj20,1917 +pip/_vendor/colorama/win32.py,sha256=5Hc7L1LabubrYDhdWAfRyzlt14ErP3YKDvf_zYaarLk,5426 +pip/_vendor/colorama/winterm.py,sha256=V7U7ojwG1q4n6PKripjEvW_htYQi5ueXSM3LUUoqqDY,6290 +pip/_vendor/distlib/__init__.py,sha256=GxRrh1augb66Eo9NB9jrdwQS02KcBypj9o_-C3oyKZI,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +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/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/database.py,sha256=LqTcNkDyV4bWcc_qDxiYJHnXaNxFs1O1bFSAg_reaI0,50868 +pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 +pip/_vendor/distlib/locators.py,sha256=e4UaQSzNg5iG3PfQRH6lnVMfLOwhm2sVmGGRdjdB3ik,51657 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/metadata.py,sha256=Ns92dqeMxopDPQsiEWnhMtd4RagJaA58lz8O_vjCxyk,39986 +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/scripts.py,sha256=WEqXkpRvqR6oe-QlMRYg8gEJxXRWJeWn1GPc0ihZ4N0,16585 +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=FnzjaibVcIg1xOtET6QPNeqTnn3LcWLCjNOficMyGKA,59494 +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +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=W9aKwi4CQL_bQFYb8IcwH-c6WK-yku5P8SY3RGPv-Mk,39506 +pip/_vendor/distro.py,sha256=dOMrjIXv-3GmEbtP-NJc057Sv19P7ZAdke-v0TBeNio,42455 +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/core.py,sha256=OwI5R_uuXU4PlOSoG8cjaMPA1hhdGGjjZ8I2MZhSPxo,11858 +pip/_vendor/idna/idnadata.py,sha256=zwxvoSsYqPHNa6xzXWHizXpDC28JJMGXRinhJ4Gkcz0,39285 +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/package_data.py,sha256=Vt9rtr32BzO7O25rypo8nzAs3syTJhG1ojU3J-s2RFo,21 +pip/_vendor/idna/uts46data.py,sha256=czULzYN5Lr9K5MmOH-1g3CJY7QPjGeHjYmC3saJ_BHk,197803 +pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 +pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 +pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 +pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 +pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 +pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 +pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 +pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 +pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc,, +pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 +pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 +pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 +pip/_vendor/packaging/__about__.py,sha256=mH-sMIEu48PzdYakZ6Y6OBzL3TlSetzz1fQSkCXiy30,720 +pip/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pip/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pip/_vendor/packaging/_structures.py,sha256=DCpKtb7u94_oqgVsIJQTrTyZcb3Gz7sSGbk9vYDMME0,1418 +pip/_vendor/packaging/markers.py,sha256=ftZegBU5oEmulEKApDGEPgti2lYIchFQHAfH9tZy3_U,8221 +pip/_vendor/packaging/requirements.py,sha256=xIWdoZXVKhUHxqFP5xmnKylM7NHXQS48hUfIIX1PvY0,4439 +pip/_vendor/packaging/specifiers.py,sha256=pFp716eLYBRt0eLNsy6cnWD9dyMKq-Zag7bsLbLv4Fs,28026 +pip/_vendor/packaging/utils.py,sha256=c9obOpok2CpKDApkc2M5ma0YFnT-jtt4I6XI4F0jYiI,1580 +pip/_vendor/packaging/version.py,sha256=MKL8nbKLPLGPouIwFvwSVnYRzNpkMo5AIcsa6LGqDF8,12219 +pip/_vendor/pep517/__init__.py,sha256=GH4HshnLERtjAjkY0zHoz3f7-35UcIvr27iFWSOUazU,82 +pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=iWpagFk2GhNBbvl-Ca2RagfD0ALuits4WWSM6nQMTdg,5831 +pip/_vendor/pep517/check.py,sha256=Yp2NHW71DIOCgkFb7HKJOzKmsum_s_OokRP6HnR3bTg,5761 +pip/_vendor/pep517/colorlog.py,sha256=2AJuPI_DHM5T9IDgcTwf0E8suyHAFnfsesogr0AB7RQ,4048 +pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 +pip/_vendor/pep517/envbuild.py,sha256=osRsJVd7hir1w_uFXiVeeWxfJ3iYhwxsKRgNBWpqtCI,5672 +pip/_vendor/pep517/wrappers.py,sha256=RhgWm-MLxpYPgc9cZ3-A3ToN99ZzgM8-ia4FDB58koM,5018 +pip/_vendor/pkg_resources/__init__.py,sha256=ykZI7-YBIAQ7ztWf0RskP8Oy1VQU88o-16PJbIMCtLg,103915 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/progress/__init__.py,sha256=Hv3Y8Hr6RyM34NdZkrZQWMURjS2h5sONRHJSvZXWZgQ,3188 +pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/helpers.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc,, +pip/_vendor/progress/bar.py,sha256=hlkDAEv9pRRiWqR5XL6vIAgMG4u_dBGEW_8klQhBRq0,2942 +pip/_vendor/progress/counter.py,sha256=XtBuZY4yYmr50E2A_fAzjWhm0IkwaVwxNsNVYDE7nsw,1528 +pip/_vendor/progress/helpers.py,sha256=6FsBLh_xUlKiVua-zZIutCjxth-IO8FtyUj6I2tx9fg,2952 +pip/_vendor/progress/spinner.py,sha256=m7bASI2GUbLFG-PbAefdHtrrWWlJLFhhSBbw70gp2TY,1439 +pip/_vendor/pyparsing.py,sha256=My2ZwDJCEaZkZgZyG9gL--48RLGmf9vnVCTW93rhdYI,226342 +pip/_vendor/pytoml/__init__.py,sha256=q12Xv23Tta44gtK4HGK68Gr4tKfciILidFPmPuoIqIo,92 +pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc,, +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/parser.py,sha256=mcTzHB2GQGyK8KVwuQ0EraSz_78O36U60NqHBtgVmV0,11247 +pip/_vendor/pytoml/writer.py,sha256=-mSOVGaiGLrpj5BRR7czmquZXJGflcElHrwAd33J48A,3815 +pip/_vendor/requests/__init__.py,sha256=OrwNk1JwZGqIQ4JVGgMbfpstqey-oHS_Re_Dw6D4ciI,4209 +pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/requests/__version__.py,sha256=rJ2xgNOLhjspGkNPfgXTBctqqvsf2uJMFTaE0rlVtbI,436 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=y5DISepvSsGlu3II_VUsdgKBej1dGY4b5beRrTE2tsI,21428 +pip/_vendor/requests/api.py,sha256=zub9ENcEUT2m9gwgBgqH5RIRDfrx2kwRpZ7L6hX3mcw,6261 +pip/_vendor/requests/auth.py,sha256=oRSQkBYcLkTEssudkzoR1UW1Glb1ts3p1RWusgHf1YU,10208 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=7EC6fZY4dJDxuBQnqUGwe13OTZ3VLGO3QfOApE5lE3I,1998 +pip/_vendor/requests/cookies.py,sha256=olUaLeNci_z1K-Bn5PeEKllSspmQqN9-s8Ug7CasaPE,18346 +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/help.py,sha256=T4K-Oo_FS9fxF8NHVR8hxMwFo71gIkRM7UddCc9vH7Y,3669 +pip/_vendor/requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 +pip/_vendor/requests/models.py,sha256=3fmmYdDW7U18SrVeZaseHuk8KPI-7vLp_435DY3ejes,34160 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=71MK2HCadovka1vAx9dyDFWAuw69KgRPRBpd0HWSEAo,27829 +pip/_vendor/requests/status_codes.py,sha256=pgw-xlnxO5zHQWn3fKps2cxwQehKzPxEbdhIrMQe6Ec,4128 +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/utils.py,sha256=3OxbbLUQFVdm84fdBD9nduXvhw6hIzj59mhvBomKuJI,30156 +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/six.py,sha256=A08MPb-Gi9FfInI3IW7HimXFmEH2T2IPzHgDvdhZPRA,30888 +pip/_vendor/urllib3/__init__.py,sha256=DZucS8tlzGYKmK5FIsyUViMghpCq_0_0Ouvm_Jp9GNc,2853 +pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=iNeAU_we9L3lMGRUKKdq24Mf7o050TXP5U4Jm9AzAY4,10841 +pip/_vendor/urllib3/connection.py,sha256=My76qeWMDkV-KP1l3iChXHOE7J-ZCaUdP3sPIiLA2uE,14485 +pip/_vendor/urllib3/connectionpool.py,sha256=w20OwKdIqk6f8FIl6QGgn6jf9gZ0-tmgH7VPxnpEgkQ,35464 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +pip/_vendor/urllib3/contrib/appengine.py,sha256=Q3BDy5C_TrI-3cSyo0ELNGlNiK2eSVptQAQMdz4PH9Q,11197 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=Q9-rO5Rh2-IqyEd4ZicpTDfMnOlf0IPPCkjhChBCjV4,4478 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=cM7fVZJRrdLZsprcdWe3meM_hvq8LR73UNDveIMa-20,15480 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=r1IADol_pBBq2Y1ub4CPyuS2hXuShK47nfFngZRcRhI,1461 +pip/_vendor/urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 +pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=XCW0ydHg171GfOqNbvUAnRzQ0lc0twp5-dIlolgf4RM,5719 +pip/_vendor/urllib3/poolmanager.py,sha256=FHBjb7odbP2LyQRzeitgpuh1AQAPyegzmrm2b3gSZlY,16821 +pip/_vendor/urllib3/request.py,sha256=fwjlq5nQfcUa7aoncR25z6-fJAX_oNTcPksKKGjBm38,5996 +pip/_vendor/urllib3/response.py,sha256=uAuOTZSuTodzvQWIDCZghDoKmZ2bKbgIRCfaVIIZfn8,24667 +pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=8K1VXm8BHsM3QATJJGBNRa_MStkzDy1Da2IaPAaCU8c,4279 +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +pip/_vendor/urllib3/util/response.py,sha256=SSNL888W-MQ8t3HAi44kNGgF682p6H__ytEXzBYxV_M,2343 +pip/_vendor/urllib3/util/retry.py,sha256=tlxiEq8OU2BSenPpPjYYO1URne8A-qTEgaykam6rZPg,15104 +pip/_vendor/urllib3/util/ssl_.py,sha256=iHJopgSv8_vXfmGg3lOsTS3ldMD9zhe130huHZxQEGU,14022 +pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +pip/_vendor/urllib3/util/wait.py,sha256=_4vvsT1BTTpqxQYK-2kXVfGsUsVRiuc4R4F-0Bf5BPc,5468 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/WHEEL b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/WHEEL new file mode 100644 index 0000000..1001235 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/entry_points.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/entry_points.txt new file mode 100644 index 0000000..f5809cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.7 = pip._internal:main + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/top_level.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip-18.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__init__.py new file mode 100644 index 0000000..ae265fa --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "18.1" diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__main__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..276124d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/__init__.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import warnings + +import sys + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + # Checks for OpenSSL 1.0.1 on MacOS + if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import commands_dict +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) + return command.main(cmd_args) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/build_env.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..673409d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/build_env.py @@ -0,0 +1,142 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip._internal.utils.misc import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import open_spinner + +logger = logging.getLogger(__name__) + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + @property + def path(self): + return self._temp_dir.path + + def __enter__(self): + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', 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 + + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=0, prefix=self.path) + platlib = get_python_lib(plat_specific=1, prefix=self.path) + if purelib == platlib: + lib_dirs = purelib + else: + lib_dirs = purelib + os.pathsep + platlib + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + os.environ['PYTHONNOUSERSITE'] = '1' + + return self.path + + def __exit__(self, exc_type, exc_val, exc_tb): + def restore_var(varname, old_value): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + restore_var('PATH', self.save_path) + restore_var('PYTHONPATH', self.save_pythonpath) + restore_var('PYTHONNOUSERSITE', self.save_nousersite) + + def cleanup(self): + self._temp_dir.cleanup() + + def missing_requirements(self, reqs): + """Return a list of the requirements from reqs that are not present + """ + missing = [] + with self: + ws = WorkingSet(os.environ["PYTHONPATH"].split(os.pathsep)) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.append(req) + except VersionConflict: + missing.append(req) + return missing + + def install_requirements(self, finder, requirements, message): + args = [ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--no-user', '--prefix', self.path, '--no-warn-script-location', + ] + 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') + if finder.process_dependency_links: + args.append('--process-dependency-links') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, show_stdout=False, 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, message): + raise NotImplementedError() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cache.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..33bec97 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cache.py @@ -0,0 +1,202 @@ +"""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.wheel import InvalidWheelFilename, Wheel + +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): + 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): + """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): + 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): + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + """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): + 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): + 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): + 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): + 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): + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + 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): + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/autocompletion.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..0a04199 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/autocompletion.py @@ -0,0 +1,152 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/base_command.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..dac4b05 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,278 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import + +import logging +import logging.config +import optparse +import os +import sys + +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.logging import setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +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 # noqa: F401 + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + hidden = False # type: bool + ignore_require_venv = False # type: bool + + def __init__(self, isolated=False): + 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 _build_session(self, options, retries=None, timeout=None): + 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): + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + # 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('ERROR: %s', exc) + logger.debug('Exception information:', exc_info=True) + + 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, args, options, finder, + session, name, wheel_cache): + """ + 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, + 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, + 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): + 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, session, + platform=None, python_versions=None, + abi=None, implementation=None): + """ + 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(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, + process_dependency_links=options.process_dependency_links, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..3033cd4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,714 @@ +""" +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 warnings +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 # noqa: F401 + + +def make_option_group(group, parser): + """ + 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): + """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): + """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 + # gauranteed 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: Any + +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." + ), +) + +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: Any + +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.' +) + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Any + +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: Any + +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: Any + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Any + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Any + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Any + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Any + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Any + +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: Any + + +def exists_action(): + 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: Any + +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: Any + +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: Any + + +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: Any + + +def find_links(): + 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(): + 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.", + ) + + +# Remove after 1.5 +process_dependency_links = partial( + Option, + "--process-dependency-links", + dest="process_dependency_links", + action="store_true", + default=False, + help="Enable the processing of dependency links.", +) # type: Any + + +def constraints(): + 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(): + 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(): + 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: Any + + +def _get_format_control(values, option): + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + 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): + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + 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(): + 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."), +) + + +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."), +) + + +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."), +) + + +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."), +) + + +def prefer_binary(): + 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 ." +) + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="store_false", + help="Disable the cache.", +) + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Any + +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: Any + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Any + +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: 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: Any + +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: Any + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Any + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Any + +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: Any + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Any + + +def _merge_hash(option, opt_str, value, parser): + """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: Any + + +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: Any + + +########## +# 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, + ] +} + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + process_dependency_links, + ] +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/main_parser.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..1774a6b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,96 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + """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) + + parser.main = True # so the help formatter knows + + # 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): + 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) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/parser.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/status_codes.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c7d1da3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/check.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..1be3ec2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,41 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.operations.check import ( + check_package_set, create_package_set_from_installed, +) + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + package_set = create_package_set_from_installed() + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + logger.info( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + logger.info( + "%s %s has requirement %s, but you have %s %s.", + project_name, version, req, dep_name, dep_version, + ) + + if missing or conflicting: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/completion.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,94 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/configuration.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..826c08d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,227 @@ +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 venv_config_file +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 --venv 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( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help='Use the virtualenv configuration file 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): + file_options = { + kinds.USER: options.user_file, + kinds.GLOBAL: options.global_file, + kinds.VENV: options.venv_file + } + + if sum(file_options.values()) == 0: + if not need_value: + return None + # Default to user, unless there's a virtualenv file. + elif os.path.exists(venv_config_file): + return kinds.VENV + else: + return kinds.USER + elif sum(file_options.values()) == 1: + # There's probably a better expression for this. + return [key for key in file_options if file_options[key]][0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --venv, --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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/download.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..b3f3c6e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,174 @@ +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( + '-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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/freeze.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/hash.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/help.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog """ + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/install.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..6fc178f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,535 @@ +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 + +try: + import wheel +except ImportError: + wheel = None + + +logger = logging.getLogger(__name__) + + +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.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, + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # If caching is disabled or wheel is not installed don't + # try to build wheels. + if wheel and options.cache_dir: + # build wheels before install. + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + # Ignore the result: a failed wheel will be + # installed from the sdist/vcs whatever. + wb.build( + requirement_set.requirements.values(), + session=session, autobuilding=True + ) + + 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): + package_set, _dep_info = check_install_conflicts(to_install) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/list.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..c6eeca7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,306 @@ +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, + process_dependency_links=options.process_dependency_links, + 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, + ) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + if options.not_required: + packages = self.get_not_required(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 = [] + + dependency_links = [] + for dist in packages: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt'), + ) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + finder.add_dependency_links(dependency_links) + + 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] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/search.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/show.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..f92c9bc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + name = 'show' + usage = """ + %prog [options] ...""" + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/uninstall.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/wheel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..9c1f149 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,183 @@ +# -*- 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.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, + ) + 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, + ) + wheels_built_successfully = wb.build( + requirement_set.requirements.values(), session=session, + ) + if not wheels_built_successfully: + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/configuration.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..fe6df9b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/configuration.py @@ -0,0 +1,387 @@ +"""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 import six +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + legacy_config_file, new_config_file, running_under_virtualenv, + site_config_files, venv_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 ( # noqa: F401 + 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 + VENV="venv", # 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.VENV, 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.VENV, 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 = six.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 currentin-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) # type: ignore + + # + # 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(site_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 + if running_under_virtualenv(): + yield kinds.VENV, [venv_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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/download.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/download.py new file mode 100644 index 0000000..96f3b65 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/download.py @@ -0,0 +1,921 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# 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._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, + display_path, format_size, get_installed_version, rmtree, splitext, + unpack_file, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +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 + + 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): + self.prompting = prompting + self.passwords = {} + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Get the netloc without any embedded credentials + netloc = parsed.netloc.rsplit("@", 1)[-1] + + # 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)) + + # Extract credentials embedded in the url if we have none stored + if username is None: + username, password = self.parse_credentials(parsed.netloc) + + # 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) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def parse_credentials(self, netloc): + if "@" in netloc: + userinfo = netloc.rsplit("@", 1)[0] + if ":" in userinfo: + user, pwd = userinfo.split(":", 1) + return (urllib_unquote(user), urllib_unquote(pwd)) + return urllib_unquote(userinfo), None + return None, None + + +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 + + 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): + """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): + """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): + """ + 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 we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + """ + 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): + """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): + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + """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, link, content_file, hashes, progress_bar): + 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, location, download_dir=None, + session=None, hashes=None, progress_bar="on"): + 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, location, download_dir=None, hashes=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) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +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, location, download_dir=None, + only_download=False, session=None, hashes=None, + progress_bar="on"): + """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, session, temp_dir, hashes, progress_bar): + """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): + """ 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/exceptions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..f1ca6f3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,268 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + + +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 + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/index.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/index.py new file mode 100644 index 0000000..8c2f24f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/index.py @@ -0,0 +1,899 @@ +"""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 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.deprecation import deprecated +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, normalize_path, + remove_auth_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.wheel import Wheel, wheel_ext + +__all__ = ['FormatControl', '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", "*", "*"), +] + + +logger = logging.getLogger(__name__) + + +def _get_content_type(url, session): + """Get the Content-Type of the given url, using a HEAD request""" + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + # FIXME: some warning or something? + # assertion error? + return '' + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + return resp.headers.get("Content-Type", "") + + +def _handle_get_page_fail(link, reason, url, meth=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): + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url + url = url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + logger.debug('Cannot look at %s URL %s', scheme, link) + return None + + try: + filename = link.filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + content_type = _get_content_type(url, session=session) + if content_type.lower().startswith('text/html'): + break + else: + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + logger.debug('Getting page %s', url) + + # Tack index.html onto file:// URLs that point to directories + (scheme, netloc, path, params, query, fragment) = \ + 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) + + 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. + content_type = resp.headers.get('Content-Type', 'unknown') + if not content_type.lower().startswith("text/html"): + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + inst = HTMLPage(resp.content, resp.url, resp.headers) + except requests.HTTPError as exc: + _handle_get_page_fail(link, exc, url) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, url, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc, url) + except requests.Timeout: + _handle_get_page_fail(link, "timed out", url) + else: + return inst + + +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, index_urls, allow_all_prereleases=False, + trusted_hosts=None, process_dependency_links=False, + session=None, format_control=None, platform=None, + versions=None, abi=None, implementation=None, + prefer_binary=False): + """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. + """ + 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 = [] + 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 + self.dependency_links = [] + + # These are boring links that have already been logged somehow: + self.logged_links = set() + + 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 []) + ] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # Do we process dependency links? + self.process_dependency_links = process_dependency_links + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # Do we prefer old, but valid, binary dist over new source dist + self.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): + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + remove_auth_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) + + def add_dependency_links(self, links): + # FIXME: this shouldn't be global list this, it should only + # apply to requirements of the package that specifies the + # dependency_links value + # FIXME: also, we should track comes_from (i.e., use Link) + if self.process_dependency_links: + deprecated( + "Dependency Links processing has been deprecated and will be " + "removed in a future release.", + replacement="PEP 508 URL dependencies", + gone_in="18.2", + issue=4187, + ) + self.dependency_links.extend(links) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + """ + 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) + 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 _candidate_sort_key(self, candidate): + """ + 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() + 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 _validate_secure_origin(self, logger, location): + # 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) + else secure_origin[1].decode("utf8") + ) + 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): + """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): + """Find all available InstallationCandidate for project_name + + This checks index_urls, find_links and dependency_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, + ) + dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, dep_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links + # We explicitly do not trust links that came from dependency_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), + (Link(url) for url in dep_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) + ) + + dependency_versions = self._package_versions( + (Link(url) for url in self.dependency_links), search + ) + if dependency_versions: + logger.debug( + 'dependency_links found: %s', + ', '.join([ + version.location.url for version in dependency_versions + ]) + ) + + 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 + + dependency_versions + ) + + def find_requirement(self, req, upgrade): + """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 + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.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 all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = 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, + ', '.join( + sorted( + {str(c.version) for c in all_candidates}, + key=parse_version, + ) + ) + ) + + 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, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() + for location in locations: + if location in seen: + continue + seen.add(location) + + page = self._get_page(location) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() + 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, search): + 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): + 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): + """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 + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return + if "binary" not in search.formats and ext == wheel_ext: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return + if ext == wheel_ext: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return + + 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_ext: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return + + if not version: + version = egg_info_matches(egg_info, search.supplied, link) + if version is None: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return + + 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 + 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 + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + def _get_page(self, link): + return _get_html_page(link, session=self.session) + + +def egg_info_matches( + egg_info, search_name, link, + _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param search_name: The name of the package this belongs to. None to + infer the name. Note that this cannot unambiguously parse strings + like foo-2-2 which might be foo, 2-2 or foo-2, 2. + :param link: The link the string came from, for logging on failure. + """ + match = _egg_info_re.search(egg_info) + if not match: + logger.debug('Could not parse version from link: %s', link) + return None + if search_name is None: + full_match = match.group(0) + return full_match.split('-', 1)[-1] + name = match.group(0).lower() + # To match the "safe" name that pkg_resources creates: + name = name.replace('_', '-') + # project name and version must be separated by a dash + look_for = search_name.lower() + "-" + if name.startswith(look_for): + return match.group(0)[len(look_for):] + else: + return None + + +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 + + +_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + +def _clean_link(url): + """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).""" + return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return self.url + + def iter_links(self): + """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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/locations.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..183aaa3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/locations.py @@ -0,0 +1,194 @@ +"""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 + +# 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): + """ + 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(): + """ + 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(): + """ + 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 + + +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") +# 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' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +venv_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): + """ + 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} + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + d.parse_config_files() + i = d.get_command_obj('install', create=True) + # 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 + if 'install_lib' in d.get_option_dict('install'): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/candidate.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/candidate.py new file mode 100644 index 0000000..c736de6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/candidate.py @@ -0,0 +1,23 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + def __init__(self, project, version, location): + self.project = project + self.version = parse_version(version) + self.location = location + + super(InstallationCandidate, self).__init__( + key=(self.project, self.version, self.location), + defining_class=InstallationCandidate + ) + + def __repr__(self): + return "".format( + self.project, self.version, self.location, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/format_control.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..2748856 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,62 @@ +from pip._vendor.packaging.utils import canonicalize_name + + +class FormatControl(object): + """A helper class for controlling formats from which packages are installed. + If a field is falsy, it isn't set. If it is {':all:'}, it should match all + packages except those listed in the other field. Only one field can be set + to {':all:'} at a time. The rest of the time exact package name matches + are listed, with any given package only showing up in one field at a time. + """ + def __init__(self, no_binary=None, only_binary=None): + self.no_binary = set() if no_binary is None else no_binary + self.only_binary = set() if only_binary is None else 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): + 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): + 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): + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/index.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..870a315 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/index.py @@ -0,0 +1,29 @@ +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): + 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): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/link.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..5decb7c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/models/link.py @@ -0,0 +1,141 @@ +import posixpath +import re + +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 splitext +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.wheel import wheel_ext + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=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' % (self.url, self.comes_from, rp) + else: + return str(self.url) + + def __repr__(self): + return '' % self + + @property + def filename(self): + _, 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): + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + return self.splitext()[1] + + @property + def url_without_fragment(self): + 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): + 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): + 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): + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + return self.ext == wheel_ext + + @property + def is_artifact(self): + """ + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/check.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/check.py new file mode 100644 index 0000000..799257a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/check.py @@ -0,0 +1,148 @@ +"""Validation of dependencies of packages +""" + +from collections import namedtuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.operations.prepare import make_abstract_dist +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from typing import ( # noqa: F401 + Any, Callable, Dict, Iterator, Optional, Set, Tuple, List + ) + + # Shorthands + PackageSet = Dict[str, 'PackageDetails'] + Missing = Tuple[str, Any] + Conflicting = Tuple[str, str, Any] + + MissingDict = Dict[str, List[Missing]] + ConflictingDict = Dict[str, List[Conflicting]] + CheckResult = Tuple[MissingDict, ConflictingDict] + +PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) + + +def create_package_set_from_installed(**kwargs): + # type: (**Any) -> PackageSet + """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 = {} + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + package_set[name] = PackageDetails(dist.version, dist.requires()) + return package_set + + +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 + ) + ) + + +# NOTE from @pradyunsg +# This required a minor update in dependency link handling logic over at +# operations.prepare.IsSDist.dist() to get it working +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(finder=None) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/freeze.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..beb2feb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,264 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, make_vcs_requirement_url, +) + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, + find_links=None, local_only=None, user_only=None, skip_regex=None, + isolated=False, + wheel_cache=None, + exclude_editable=False, + skip=()): + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + dependency_links = [] + + for dist in pkg_resources.working_set: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt') + ) + for link in find_links: + if '#egg=' in link: + dependency_links.append(link) + for link in find_links: + yield '-f %s' % link + installations = {} + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist( + dist, + dependency_links + ) + 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() + # 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) + 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 that " + "package is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + ) + 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() + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def _init_args_from_dist(cls, dist, dependency_links): + """ + Compute and return arguments (req, editable, comments) to pass to + FrozenRequirement.__init__(). + + This method is for use in FrozenRequirement.from_dist(). + """ + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip._internal.vcs import vcs, get_src_requirement + if dist_is_editable(dist) and vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location) + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + req = None + if req is None: + logger.warning( + 'Could not determine repository location of %s', location + ) + comments.append( + '## !! Could not determine repository location' + ) + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ + 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ + (specs, dist) + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend().get_location( + dist, + dependency_links, + ) + if not svn_location: + logger.warning( + 'Warning: cannot find svn location for %s', req, + ) + comments.append( + '## FIXME: could not find svn URL in dependency_links ' + 'for this package:' + ) + else: + deprecated( + "SVN editable detection based on dependency links " + "will be dropped in the future.", + replacement=None, + gone_in="18.2", + issue=4187, + ) + comments.append( + '# Installing as editable to satisfy requirement %s:' % + req + ) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + egg_name = cls.egg_name(dist) + req = make_vcs_requirement_url(svn_location, rev, egg_name) + + return (req, editable, comments) + + @classmethod + def from_dist(cls, dist, dependency_links): + args = cls._init_args_from_dist(dist, dependency_links) + return cls(dist.project_name, *args) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/prepare.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..104bea3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,355 @@ +"""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.vcs import vcs + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + """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): + self.req = req + + def dist(self, finder): + """Return a setuptools Dist object.""" + raise NotImplementedError(self.dist) + + def prep_for_dist(self, finder, build_isolation): + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError(self.dist) + + +class IsWheel(DistAbstraction): + + def dist(self, finder): + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self, finder): + dist = self.req.get_dist() + # FIXME: shouldn't be globally added. + if finder and dist.has_metadata('dependency_links.txt'): + finder.add_dependency_links( + dist.get_metadata_lines('dependency_links.txt') + ) + return dist + + def prep_for_dist(self, finder, build_isolation): + # 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, + "Installing build dependencies" + ) + missing = [] + if self.req.requirements_to_check: + check = self.req.requirements_to_check + missing = self.req.build_env.missing_requirements(check) + 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))) + ) + + self.req.run_egg_info() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self, finder): + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__(self, build_dir, download_dir, src_dir, wheel_download_dir, + progress_bar, build_isolation, req_tracker): + 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): + # 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, session, finder, + upgrade_allowed, require_hashes): + """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 req.link.scheme in vcs.all_schemes: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement(self, req, require_hashes, use_user_site, + finder): + """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): + """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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pep425tags.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..ab1a029 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,317 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc +from pip._internal.utils.compat import get_extension_suffixes + +logger = logging.getLogger(__name__) + +_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: + logger.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 + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + 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() + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pyproject.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..f938a76 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,144 @@ +from __future__ import absolute_import + +import io +import os + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError + + +def _is_list_of_str(obj): + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): + """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 equalling False because that + # means the user explicitly requested --no-use-pep517 + if has_pyproject and not has_setup: + if use_pep517 is False: + 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 False: + 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, and require wheel and a version + # of setuptools that supports that backend. + build_system = { + "requires": ["setuptools>=38.2.5", "wheel"], + "build-backend": "setuptools.build_meta", + } + + # 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 = [] + 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 neede 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. + # TODO: Review this - it's quite a lot of work to check for a very + # specific case. 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" + check = ["setuptools>=38.2.5", "wheel"] + + return (requires, backend, check) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..b270498 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log + + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs(to_install, install_options, global_options=(), + *args, **kwargs): + """ + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/constructors.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..4c4641d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,298 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re +import traceback + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.download import ( + is_archive_file, is_url, path_to_url, url_to_path, +) +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.misc import is_installable_dir +from pip._internal.vcs import vcs +from pip._internal.wheel import Wheel + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path): + 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): + """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')): + raise InstallationError( + "Directory %r is not installable. File 'setup.py' not found." % + url_no_extras + ) + # 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): + """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=1) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, comes_from=None, isolated=False, options=None, + wheel_cache=None, constraint=False +): + 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, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + +def install_req_from_line( + name, comes_from=None, isolated=False, options=None, wheel_cache=None, + constraint=False +): + """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 = name.split(marker_sep, 1) + markers = markers.strip() + if not markers: + markers = None + else: + markers = Marker(markers) + else: + markers = None + name = name.strip() + req = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras = None + + if is_url(name): + link = Link(name) + else: + p, extras = _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 = "%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 = link.egg_fragment + + # a requirement specifier + else: + req = name + + if extras: + extras = Requirement("placeholder" + extras.lower()).extras + else: + extras = () + if req is not None: + try: + req = Requirement(req) + except InvalidRequirement: + if os.path.sep in req: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req) + elif '=' in req and not any(op in req for op in operators): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = traceback.format_exc() + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req, add_msg) + ) + + return InstallRequirement( + req, comes_from, link=link, markers=markers, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + +def install_req_from_req( + req, comes_from=None, isolated=False, wheel_cache=None +): + try: + req = Requirement(req) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if req.url 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 + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_file.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..e7acf7c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,340 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s)+#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?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.process_dependency_links, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements(filename, finder=None, comes_from=None, options=None, + session=None, constraint=False, wheel_cache=None): + """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 + """ + 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, + constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + """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) + 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, filename, line_number, finder=None, comes_from=None, + options=None, session=None, wheel_cache=None, + constraint=False): + """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: + # `finder.format_control` will be updated during parsing + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + if sys.version_info < (2, 7, 3): + # Prior to 2.7.3, shlex cannot deal with unicode entries + options_str = options_str.encode('utf8') + opts, _ = parser.parse_args(shlex.split(options_str), defaults) + + # 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, + 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, + 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? + parser = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parser: + 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.process_dependency_links: + finder.process_dependency_links = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + """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) + + +def build_parser(line): + """ + 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): + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(msg) + parser.exit = parser_exit + + return parser + + +def join_lines(lines_enum): + """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 = [] + 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): + """ + 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): + """ + 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): + """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 discusssion 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_install.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..c2624fe --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,860 @@ +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 +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, 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.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relavant requirement and also contains logic for + installing the said requirement. + """ + + def __init__(self, req, comes_from, source_dir=None, editable=False, + link=None, update=True, markers=None, + isolated=False, options=None, wheel_cache=None, + constraint=False, extras=()): + 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 not None: + self.link = self.original_link = link + else: + self.link = self.original_link = req and req.url and Link(req.url) + + 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 not None: + self.markers = markers + else: + self.markers = req and req.marker + self._egg_info_path = None + # 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 + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None + # 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() + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None + + # Build requirements that we will check are available + # TODO: We don't do this for --no-build-isolation. Should we? + self.requirements_to_check = [] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None + + # 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 = None + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % self.link.url + elif self.link: + s = 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): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + """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): + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + return self.req.specifier + + @property + def is_pinned(self): + """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): + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + 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): + """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): + """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): + """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): + 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): + """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.path + 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 + + def remove_temporary_source(self): + """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): + """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): + return self.link and self.link.is_wheel + + def move_wheel_files(self, wheeldir, root=None, home=None, prefix=None, + warn_script_location=True, use_user_site=False, + pycompile=True): + 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): + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + 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): + assert self.source_dir, "No source dir for %s" % self + + pp_toml = os.path.join(self.setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(pp_toml, six.text_type): + pp_toml = pp_toml.encode(sys.getfilesystemencoding()) + + return pp_toml + + def load_pyproject_toml(self): + """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) + + def run_egg_info(self): + assert self.source_dir + 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, + ) + + with indent_log(): + 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 = [] + 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, + show_stdout=False, + command_desc='python setup.py 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( + 'Running setup.py (path:%s) egg_info for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.setup_py, self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + @property + def egg_info_path(self): + 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): + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + """Return a pkg_resources.Distribution built from self.egg_info_path""" + 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] + return pkg_resources.Distribution( + os.path.dirname(egg_info), + project_name=dist_name, + metadata=metadata, + ) + + def assert_source_matches_version(self): + 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): + """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, + global_options=(), prefix=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, + show_stdout=False, + ) + + self.install_succeeded = True + + def update_editable(self, obtain=True): + 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): + """ + 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 + 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. + 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 + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + 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: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, self.name + '/' + name) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def install(self, install_options, global_options=None, root=None, + home=None, prefix=None, warn_script_location=True, + use_user_site=False, pycompile=True): + 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: + global_options = global_options + ["--no-user-cfg"] + + 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, + show_stdout=False, + 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): + 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, record_filename, root, prefix, + pycompile): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_set.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..b198317 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,181 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.wheel import Wheel + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} + self.unnamed_requirements = [] + self.successfully_downloaded = [] + self.reqs_to_cleanup = [] + + def __str__(self): + 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): + 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, parent_req_name=None, + extras_requested=None): + """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): + 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 + + @property + def has_requirements(self): + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + 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): + """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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_tracker.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..0a86f4c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + 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() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cleanup() + + def _entry_path(self, link): + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + 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): + 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): + 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): + self.add(req) + yield + self.remove(req) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_uninstall.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..a7d8230 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,460 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, + normalize_path, renames, +) +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + """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): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + """ + 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): + """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() + for path in sorted(paths, key=len): + should_add = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_add: + short_paths.add(path) + return short_paths + + +def compress_for_output_listing(paths): + """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 = list(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) + + _normcased_files = set(map(os.path.normcase, files)) + + 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 UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self.save_dir = TempDirectory(kind="uninstall") + self._moved_paths = [] + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + 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): + 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 _stash(self, path): + return os.path.join( + self.save_dir.path, os.path.splitdrive(path)[1].lstrip(os.path.sep) + ) + + def remove(self, auto_confirm=False, verbose=False): + """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): + self.save_dir.create() + + for path in sorted(compact(self.paths)): + new_path = self._stash(path) + logger.debug('Removing file or directory %s', path) + self._moved_paths.append(path) + renames(path, new_path) + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + 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 = list(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) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + """Rollback the changes previously made by remove().""" + if self.save_dir.path is None: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return False + logger.info('Rolling back uninstall of %s', self.dist.project_name) + for path in self._moved_paths: + tmp_path = self._stash(path) + logger.debug('Replacing %s', path) + renames(tmp_path, path) + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + self.save_dir.cleanup() + self._moved_paths = [] + + @classmethod + def from_dist(cls, dist): + 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): + 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() + self._saved_lines = None + + def add(self, entry): + 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): + 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): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/resolve.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/resolve.py new file mode 100644 index 0000000..2d9f1c5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/resolve.py @@ -0,0 +1,353 @@ +"""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 +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 + +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, session, finder, wheel_cache, use_user_site, + ignore_dependencies, ignore_installed, ignore_requires_python, + force_reinstall, isolated, upgrade_strategy): + 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 + + self.require_hashes = None # This is set in resolve + + 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._discovered_dependencies = defaultdict(list) + + def resolve(self, requirement_set): + """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 = [] + 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): + 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): + """ + 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): + """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): + """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, req_to_install): + """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(self.finder) + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + ) + 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): + """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() + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/appdirs.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..cc96f98 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,258 @@ +""" +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 + + +def user_cache_dir(appname): + 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): + 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): + """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): + 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): + """ + 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): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..3114f2d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,248 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress + ipaddress.ip_network = ipaddress.IPNetwork + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (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): + """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: + s = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + s = 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: + s = s.encode(output_encoding, errors="backslashreplace") + s = s.decode(output_encoding) + + return s + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # 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): + """ + 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): + """ + 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): + """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(): + """ + 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()) +else: + def get_terminal_size(): + """ + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/deprecation.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..bd744cf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,89 @@ +""" +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 # noqa: F401 + + +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(): + # 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: " + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/encoding.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..56f6036 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,33 @@ +import codecs +import locale +import re +import sys + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + """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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/filesystem.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e9cebd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,28 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +def check_path_owner(path): + # 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) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/glibc.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..ebcfc5b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,84 @@ +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[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): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/hashes.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..8b909ba --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=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): + """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): + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + """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): + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + 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): + """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): + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/logging.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..d9b9541 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,225 @@ +from __future__ import absolute_import + +import contextlib +import logging +import logging.handlers +import os + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.misc import ensure_dir + +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 + + +@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 format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = logging.Formatter.format(self, record) + formatted = "".join([ + (" " * get_indentation()) + 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 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 + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + """ + + # 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" + + # 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", + } + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent", + }, + }, + "root": { + "level": root_level, + "handlers": ["console", "console_errors"] + ( + ["user_log"] if include_user_log else [] + ), + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/misc.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..84a421f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,940 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) + +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', '.whl') +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs): + try: + return __import__(pkg_or_module_string) + except ImportError: + raise ExceptionType(*args, **kwargs) + + +def ensure_dir(path): + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + 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): + 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): + """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'): + """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): + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + """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): + 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): + """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): + """ + 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): + 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): + 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): + """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): + """ + 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): + """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): + """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): + """ + 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): + """ + 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): + """ + 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): + """ + 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): + """Is distribution 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): + """ + 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 + + return [d for d in pkg_resources.working_set + 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): + """ + 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 + + +def dist_location(dist): + """ + 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): + """ + 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 + data = zip.read(name) + 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) + fp = open(fn, 'wb') + try: + fp.write(data) + 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): + """ + 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: + # note: python<=2.5 doesn't seem to know about pax headers, filter them + leading = has_leading_dir([ + member.name for member in tar.getmembers() + if member.name != 'pax_global_header' + ]) + for member in tar.getmembers(): + fn = member.name + if fn == 'pax_global_header': + continue + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + 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) + tar.utime(member, path) + # 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, location, content_type, link): + 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 call_subprocess(cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, unset_environ=None, spinner=None): + """ + Args: + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if unset_environ is None: + unset_environ = [] + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("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=stdout, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + if stdout is not None: + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + 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)) + if not show_stdout: + return ''.join(all_output) + + +def read_text_file(filename): + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + data = data.decode(enc) + except UnicodeDecodeError: + continue + break + + assert type(data) != bytes # Latin1 should have worked. + return data + + +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') + + +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 make_vcs_requirement_url(repo_url, rev, egg_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+"). + """ + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +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 = tuple(auth.split(':', 1)) + else: + user_pass = auth, None + + return netloc, user_pass + + +def remove_auth_from_url(url): + # 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. + + # parsed url + purl = urllib_parse.urlsplit(url) + netloc, user_pass = split_auth_from_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 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/models.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/outdated.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..5bfbfe1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,154 @@ +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 + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + def __init__(self, cache_dir): + self.state = {} + 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): + # 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): + """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): + """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, + process_dependency_links=options.process_dependency_links, + session=session, + ) + all_candidates = finder.find_all_candidates("pip") + if not all_candidates: + return + pypi_version = str( + max(all_candidates, key=lambda c: c.version).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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/packaging.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..c43142f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,75 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser # type: ignore + +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 + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + """ + 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): + 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): + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/setuptools_build.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/temp_dir.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..edc506b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,82 @@ +from __future__ import absolute_import + +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 it's 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 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/typing.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..e085cdf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""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 ... # noqa: F401 + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/ui.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 0000000..6bab904 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,421 @@ +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.bar import ( + Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, + ShadyBar, +) +from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +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 # noqa: F401 + +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 neds 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): # type: ignore + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore + ChargingBar): + pass + + +class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore + pass + + +class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore + FillingSquaresBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, 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): + # 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): + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 + + def ready(self): + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + self._last_update = time.time() + + +class InteractiveSpinner(object): + 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): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + 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(object): + def __init__(self, message, min_update_interval_seconds=60): + 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): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # 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) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..794b35d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,509 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Optional, Tuple # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +__all__ = ['vcs', 'get_src_requirement'] + + +logger = logging.getLogger(__name__) + + +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, vcs, rev=None, extra_args=None): + """ + Args: + vcs: a VersionControl object. + 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.vcs = vcs + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) + + @property + def arg_rev(self): + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + """ + Return the VCS-specific command arguments. + """ + args = [] + rev = self.arg_rev + if rev is not None: + args += self.vcs.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + """ + 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.vcs.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Command] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # 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): + return list(self._registry.values()) + + @property + def dirnames(self): + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + schemes = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + 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): + 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_name(self, location): + """ + Return the name of the version control backend if found at given + location, e.g. vcs.get_backend_name('/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.name + return None + + def get_backend(self, name): + name = name.lower() + if name in self._registry: + return self._registry[name] + + def get_backend_from_location(self, location): + vc_type = self.get_backend_name(location) + if vc_type: + return self.get_backend(vc_type) + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + # 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] + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def get_base_rev_args(self, rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def make_rev_options(self, rev=None, extra_args=None): + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(self, rev, extra_args=extra_args) + + def _is_local_repository(self, repo): + """ + 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 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 + + def get_netloc_and_auth(self, 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) + + def get_url_rev_and_auth(self, url): + """ + 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 = self.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 + + def make_rev_args(self, username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + """ + 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 + + def normalize_url(self, url): + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def fetch_new(self, 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 + + def is_commit_id_equal(self, 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): + """ + 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_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, + ) + prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('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): + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + def get_src_requirement(self, dist, location): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + def get_url(self, location): + """ + Return the url used at location + """ + raise NotImplementedError + + def get_revision(self, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + def run_command(self, cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, spinner=None): + """ + 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 = [self.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode, + command_desc, extra_environ, + unset_environ=self.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?' % (self.name, self.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + """ + 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): + """ + 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) + + +def get_src_requirement(dist, location): + version_control = vcs.get_backend_from_location(location) + if version_control: + try: + return version_control().get_src_requirement(dist, + location) + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + version_control.name, + ) + return dist.as_requirement() + logger.warning( + 'cannot determine version of editable source in %s (is not SVN ' + 'checkout, Git clone, Mercurial clone or Bazaar branch)', + location, + ) + return dist.as_requirement() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/bazaar.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..3cc66c9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,112 @@ +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, make_vcs_requirement_url, rmtree, +) +from pip._internal.utils.temp_dir import TempDirectory +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']) + + def get_base_rev_args(self, 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) + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['export', location], + cwd=temp_dir.path, show_stdout=False, + ) + + def fetch_new(self, 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] + self.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) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + def get_url(self, location): + urls = self.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 self._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + def get_revision(self, location): + revision = self.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + current_rev = self.get_revision(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, current_rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/git.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..9778539 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,346 @@ +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, make_vcs_requirement_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import 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) + + def get_base_rev_args(self, 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 becasue + # 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) + + def get_branch(self, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + args = ['rev-parse', '--abbrev-ref', 'HEAD'] + output = self.run_command(args, show_stdout=False, cwd=location) + branch = output.strip() + + if branch == 'HEAD': + return None + + return branch + + 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 + ) + + def get_revision_sha(self, 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 = self.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) + + def resolve_revision(self, 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 = self.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. + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = self.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + def is_commit_id_equal(self, 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 self.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', url, rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.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 self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + elif self.get_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, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.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) + + def get_url(self, location): + """Return URL of the first remote encountered.""" + remotes = self.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + show_stdout=False, cwd=location, + ) + remotes = remotes.splitlines() + found_remote = remotes[0] + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + def get_revision(self, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = self.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + def _get_subdirectory(self, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = self.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) + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + current_rev = self.get_revision(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + subdir = self._get_subdirectory(location) + req = make_vcs_requirement_url(repo, current_rev, egg_project_name, + subdir=subdir) + + return req + + def get_url_rev_and_auth(self, 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, self).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + + return url, rev, user_pass + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/mercurial.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..17cfb67 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,101 @@ +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, make_vcs_requirement_url +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') + + def get_base_rev_args(self, 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 + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.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) + + def get_url(self, location): + url = self.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if self._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + def get_revision(self, location): + current_revision = self.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + def get_revision_hash(self, location): + current_rev_hash = self.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + current_rev_hash = self.get_revision_hash(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, current_rev_hash, + egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/subversion.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..6f7cb5d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.models.link import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, +) +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>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_base_rev_args(self, rev): + return ['-r', rev] + + 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) + + def fetch_new(self, 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] + self.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) + + def get_location(self, dist, dependency_links): + for url in dependency_links: + egg_fragment = Link(url).egg_fragment + if not egg_fragment: + continue + if '-' in egg_fragment: + # FIXME: will this work when a package has - in the name? + key = '-'.join(egg_fragment.split('-')[:-1]).lower() + else: + key = egg_fragment + if key == dist.key: + return url.split('#', 1)[0] + return None + + def get_revision(self, 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 self.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(self.dirname) + entries_fn = os.path.join(base, self.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = self._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 + + def get_netloc_and_auth(self, 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, self).get_netloc_and_auth( + netloc, scheme) + + return split_auth_from_netloc(netloc) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + def make_rev_args(self, username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + def get_url(self, 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 self._get_svn_url_rev(location)[0] + + def _get_svn_url_rev(self, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, self.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 = self.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 + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if repo is None: + return None + repo = 'svn+' + repo + rev = self.get_revision(location) + # FIXME: why not project name? + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/wheel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/wheel.py new file mode 100644 index 0000000..5ce890e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_internal/wheel.py @@ -0,0 +1,831 @@ +""" +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.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, captured_stdout, ensure_dir, 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 # noqa: F401 + +wheel_ext = '.whl' + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def rehash(path, blocksize=1 << 20): + """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('=') + return (digest, length) + + +def open_for_csv(name, mode): + if sys.version_info[0] < 3: + nl = {} + bin = 'b' + else: + nl = {'newline': ''} + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + """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 + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + """ + 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): + 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: (List[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(): + scripts = sorted(scripts) + if len(scripts) == 1: + start_text = "script {} is".format(scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(scripts[:-1]) + " and " + 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 move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, + pycompile=True, scheme=None, isolated=False, prefix=None, + warn_script_location=True): + """Install a wheel""" + + 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 = [] + 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 = {} + changed = set() + generated = [] + + # 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 normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + 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, + } + + maker._get_script_text = _get_script_text + 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) + writer = csv.writer(record_out) + outrows = [] + for row in reader: + row[0] = installed.pop(row[0], row[0]) + if row[0] in changed: + row[1], row[2] = rehash(row[0]) + outrows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + outrows.append((normpath(f, lib_dir), digest, length)) + for f in installed: + outrows.append((installed[f], '', '')) + for row in sorted(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return False 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 False + + +def check_compatibility(version, name): + """ + 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 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): + """ + :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): + """ + 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): + """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)) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__(self, finder, preparer, wheel_cache, + build_options=None, global_options=None, no_clean=False): + 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 self.__build_one(req, temp_dir.path, python_tag=python_tag): + try: + wheel_name = os.listdir(temp_dir.path)[0] + wheel_path = os.path.join(output_dir, wheel_name) + shutil.move( + os.path.join(temp_dir.path, wheel_name), wheel_path + ) + logger.info('Stored in directory: %s', output_dir) + return wheel_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(self, req, tempd, python_tag=None): + base_args = self._base_setup_args(req) + + spin_message = 'Running setup.py bdist_wheel for %s' % (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: + call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + return True + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return False + + 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, show_stdout=False) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build(self, requirements, session, autobuilding=False): + """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. + """ + from pip._internal import index + from pip._internal.models.link import Link + + building_is_possible = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert building_is_possible + + buildset = [] + format_control = self.finder.format_control + for req in requirements: + if req.constraint: + continue + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + elif autobuilding and req.editable: + pass + elif autobuilding and not req.source_dir: + pass + elif autobuilding and req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + buildset.append((req, True)) + else: + ephem_cache = False + if autobuilding: + link = req.link + base, ext = link.splitext() + if index.egg_info_matches(base, None, link) is None: + # E.g. local directory. Build wheel just for this run. + ephem_cache = 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, + ) + continue + buildset.append((req, ephem_cache)) + + if not buildset: + return True + + # 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 True if all builds were successful + return len(build_failure) == 0 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..a0aae81 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,110 @@ +""" +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__(vendored_name, globals(), locals(), level=0) + except ImportError: + 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("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/appdirs.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/cache.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/controller.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,367 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..aa329fb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where, old_where + +__version__ = "2018.08.24" diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__main__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..85de024 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4300 @@ + +# 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=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----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----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----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----- diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/core.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..eab9d1d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os +import warnings + + +class DeprecatedBundleWarning(DeprecationWarning): + """ + The weak security bundle is being deprecated. Please bother your service + provider to get them to stop using cross-signed roots. + """ + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +def old_where(): + warnings.warn( + "The weak security bundle has been removed. certifi.old_where() is now an alias " + "of certifi.where(). Please update your code to use certifi.where() instead. " + "certifi.old_where() will be removed in 2018.", + DeprecatedBundleWarning + ) + return where() + +if __name__ == '__main__': + print(where()) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5freq.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5prober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/chardistribution.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cp949prober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/enums.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escsm.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jisfreq.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jpcntx.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/latin1prober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcssm.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sjisprober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/universaldetector.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/utf8prober.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..f4d9ce2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,7 @@ +# 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.3.9' + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansi.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..1d6e605 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,236 @@ +# 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() + + +def is_stream_closed(stream): + return not hasattr(stream, 'closed') or stream.closed + + +def is_a_tty(stream): + return hasattr(stream, 'isatty') and stream.isatty() + + +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 write(self, text): + self.__convertor.write(text) + + +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 is_stream_closed(wrapped) and not is_a_tty(wrapped)) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) + 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 is_stream_closed(self.wrapped): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/initialise.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..834962a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,82 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/win32.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..8262e35 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,156 @@ +# 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 + + handles = { + STDOUT: _GetStdHandle(STDOUT), + STDERR: _GetStdHandle(STDERR), + } + + 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 handles.values()) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = handles[stream_id] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = handles[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 = handles[stream_id] + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = handles[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 = handles[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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/winterm.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..60309d3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,162 @@ +# 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) + + 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 + if 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 + # 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 + if 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 + # 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..d4aab45 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- 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.7' + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/database.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..a19905e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1336 @@ +# -*- 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 +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] + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/index.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/manifest.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/markers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/metadata.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..6d6470f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1091 @@ +# -*- 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') + +_566_FIELDS = _426_FIELDS + ('Description-Content-Type',) + +_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' + + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/resources.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/scripts.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..0b7c3d0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,415 @@ +# -*- 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 use_launcher: + script_bytes = shebang + linesep + 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 + linesep + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/wheel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..7737223 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,984 @@ +# -*- 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. + + 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) + + 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) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distro.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..aa4defc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1197 @@ +# 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 a renewed alternative implementation 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.7 is expected to remove it +altogether. Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +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 = {} + +#: 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`. + """ + return self.os_release_attr('codename') \ + or 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`. + """ + + 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 + if k == 'VERSION': + # this handles cases in which the codename is in + # the `(CODENAME)` (rhel, centos, fedora) format + # or in the `, CODENAME` format (Ubuntu). + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + else: + props['codename'] = '' + else: + # Ignore any tokens that are not variable assignments + pass + 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 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) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/base.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/serializer.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/codec.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/core.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..090c2c1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,399 @@ +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') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/idnadata.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..17974e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1893 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "10.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, + 0x4e0000009feb, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 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, + 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, + 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, + 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, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d4000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 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, + 0xc0000000c04, + 0xc0500000c0d, + 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, + 0x182000001878, + 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, + 0x31050000312f, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009feb, + 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, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a8fe, + 0xa9000000a92e, + 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, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111ca000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133c00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171a, + 0x1171d0001172c, + 0x117300001173a, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187ed, + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/intranges.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/package_data.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..39c192b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.7' + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/uts46data.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..79731cb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8179 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "10.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'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + ] + +def _seg_10(): + return [ + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (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'), + (0x800, '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'), + (0x8D4, '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'), + (0x9FE, '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'), + ] + +def _seg_11(): + return [ + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA76, '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'), + (0xC04, 'X'), + ] + +def _seg_12(): + return [ + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (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'), + (0xC84, 'X'), + (0xC85, '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'), + ] + +def _seg_13(): + return [ + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (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'), + ] + +def _seg_14(): + return [ + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (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'), + (0x1878, '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'), + ] + +def _seg_15(): + return [ + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (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'χ'), + ] + +def _seg_16(): + return [ + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + (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'ḹ'), + ] + +def _seg_17(): + return [ + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (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'), + ] + +def _seg_18(): + return [ + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (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'ἅ'), + ] + +def _seg_19(): + return [ + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + (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'ἤι'), + ] + +def _seg_20(): + return [ + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (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'), + ] + +def _seg_21(): + return [ + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (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'), + ] + +def _seg_22(): + return [ + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (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'〈'), + ] + +def _seg_23(): + return [ + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (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'), + ] + +def _seg_24(): + return [ + (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'), + (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'), + (0x2BBA, 'X'), + (0x2BBD, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BD3, 'X'), + (0x2BEC, 'V'), + (0x2BF0, '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'ɽ'), + ] + +def _seg_25(): + return [ + (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'ɒ'), + (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'), + ] + +def _seg_26(): + return [ + (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'ⳛ'), + (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'), + (0x2E4A, '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'夊'), + ] + +def _seg_27(): + return [ + (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'山'), + (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'舌'), + ] + +def _seg_28(): + return [ + (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'襾'), + (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'コト'), + ] + +def _seg_29(): + return [ + (0x3100, 'X'), + (0x3105, 'V'), + (0x312F, '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'ᄄ'), + (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'一'), + ] + +def _seg_30(): + return [ + (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'天'), + (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'), + ] + +def _seg_31(): + return [ + (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'ᄅ'), + (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'), + ] + +def _seg_32(): + return [ + (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月'), + (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'サンチーム'), + ] + +def _seg_33(): + return [ + (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'パーセント'), + (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'), + ] + +def _seg_34(): + return [ + (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'), + (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日'), + ] + +def _seg_35(): + return [ + (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日'), + (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'), + (0x9FEB, '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'ꚕ'), + ] + +def _seg_36(): + return [ + (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'), + (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'ꞃ'), + ] + +def _seg_37(): + return [ + (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'), + (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, 'X'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, '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'), + (0xA8FE, 'X'), + (0xA900, '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'), + ] + +def _seg_38(): + return [ + (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'Ꭺ'), + (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'金'), + ] + +def _seg_39(): + return [ + (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'洛'), + (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'葉'), + ] + +def _seg_40(): + return [ + (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'凉'), + (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'戮'), + ] + +def _seg_41(): + return [ + (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'利'), + (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'層'), + ] + +def _seg_42(): + return [ + (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'渚'), + (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'瑱'), + ] + +def _seg_43(): + return [ + (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'窱'), + (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'ךּ'), + ] + +def _seg_44(): + return [ + (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'), + (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'خم'), + ] + +def _seg_45(): + return [ + (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'طح'), + (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'قي'), + ] + +def _seg_46(): + return [ + (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'نر'), + (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'تم'), + ] + +def _seg_47(): + return [ + (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'نم'), + (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'حمي'), + ] + +def _seg_48(): + return [ + (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'شجي'), + (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'صلعم'), + ] + +def _seg_49(): + return [ + (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','), + (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'ت'), + ] + +def _seg_50(): + return [ + (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'ص'), + (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'), + ] + +def _seg_51(): + return [ + (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'), + (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'ᄃ'), + ] + +def _seg_52(): + return [ + (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'ᄇ'), + (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'), + ] + +def _seg_53(): + return [ + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (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'), + ] + +def _seg_54(): + return [ + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (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'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, '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'𐳝'), + ] + +def _seg_55(): + return [ + (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'𐳨'), + (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'), + (0x10D00, 'X'), + (0x10E60, 'V'), + (0x10E7F, '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'), + (0x11144, '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'), + (0x1133C, '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'), + ] + +def _seg_56(): + return [ + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x1145E, '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'), + (0x1171A, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, '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'), + (0x11A9D, 'X'), + (0x11A9E, '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'), + ] + +def _seg_57(): + return [ + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, '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'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187ED, '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'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, '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'), + ] + +def _seg_58(): + return [ + (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'), + (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'), + ] + +def _seg_59(): + return [ + (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'), + (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'), + ] + +def _seg_60(): + return [ + (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'), + (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'), + ] + +def _seg_61(): + return [ + (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'), + (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'), + ] + +def _seg_62(): + return [ + (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'), + (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'), + ] + +def _seg_63(): + return [ + (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'), + (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'), + ] + +def _seg_64(): + return [ + (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'τ'), + (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'η'), + ] + +def _seg_65(): + return [ + (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'ζ'), + (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'σ'), + ] + +def _seg_66(): + return [ + (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'ψ'), + (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'ε'), + ] + +def _seg_67(): + return [ + (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'), + (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'), + ] + +def _seg_68(): + return [ + (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'), + (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'ش'), + (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'), + ] + +def _seg_69(): + return [ + (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'د'), + (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'ق'), + ] + +def _seg_70(): + return [ + (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)'), + (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, 'X'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + ] + +def _seg_71(): + return [ + (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'配'), + (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'), + ] + +def _seg_72(): + return [ + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6F9, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D5, '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'), + (0x1F94D, 'X'), + (0x1F950, 'V'), + (0x1F96C, 'X'), + (0x1F980, 'V'), + (0x1F998, 'X'), + (0x1F9C0, 'V'), + (0x1F9C1, 'X'), + (0x1F9D0, 'V'), + (0x1F9E7, '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'剆'), + (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'𠭣'), + ] + +def _seg_73(): + return [ + (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'𢆃'), + (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'悁'), + ] + +def _seg_74(): + return [ + (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'次'), + (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'浸'), + ] + +def _seg_75(): + return [ + (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'𥛅'), + (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'𥾆'), + ] + +def _seg_76(): + return [ + (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'蛢'), + (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'誠'), + ] + +def _seg_77(): + return [ + (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'), + (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() +) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/_version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/exceptions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/fallback.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__about__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..21fc6ce --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# 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__ = "18.0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2018 %s" % __author__ diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_structures.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..e9fc4a0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,70 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/markers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..e5834ce --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# 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") | # 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/requirements.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..d40bd8c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,130 @@ +# 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 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("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/specifiers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..4c79899 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..4b94a82 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,63 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..6ed5cbb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,441 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..8beedea --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.2' diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/_in_process.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..baa14d3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,182 @@ +"""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 + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + obj = import_module(mod_path) + 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 GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + +if __name__ == '__main__': + main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/check.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..c65d51c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/check.py @@ -0,0 +1,194 @@ +"""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): + with BuildEnvironment() as env: + try: + env.pip_install(hooks.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: + 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: + 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): + with BuildEnvironment() as env: + try: + env.pip_install(hooks.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: + 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: + 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) + wheel_ok = check_build_wheel(hooks) + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/colorlog.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..26cf748 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,110 @@ +"""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): + l = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if l + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (l + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/envbuild.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..c264f46 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,150 @@ +"""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): + if self._cleanup and (self.path is not None) and os.path.isdir(self.path): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/wrappers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..28260f3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,134 @@ +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 UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + +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 + + 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): + env = os.environ.copy() + + # 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 + + env['PEP517_BUILD_BACKEND'] = build_backend + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + check_call([sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, env=env) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + return data['return_val'] + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..a41f65d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/__init__.py @@ -0,0 +1,127 @@ +# 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 + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +from time import time + + +__version__ = '1.4' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + + def __init__(self, *args, **kwargs): + self.index = 0 + self.start_ts = time() + self.avg = 0 + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(time() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + self._xput.append(dt / n) + self.avg = sum(self._xput) / len(self._xput) + + def update(self): + pass + + def start(self): + pass + + def finish(self): + pass + + def next(self, n=1): + now = time() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + try: + for x in it: + yield x + self.next() + finally: + 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 + + try: + for x in it: + yield x + self.next() + finally: + self.finish() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/bar.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..025e61c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/bar.py @@ -0,0 +1,94 @@ +# -*- 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 +from .helpers import WritelnMixin + + +class Bar(WritelnMixin, Progress): + width = 32 + message = '' + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + hide_cursor = True + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/counter.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..6b45a1e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/counter.py @@ -0,0 +1,48 @@ +# -*- 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 +from .helpers import WriteMixin + + +class Counter(WriteMixin, Infinite): + message = '' + hide_cursor = True + + def update(self): + self.write(str(self.index)) + + +class Countdown(WriteMixin, Progress): + hide_cursor = True + + def update(self): + self.write(str(self.remaining)) + + +class Stack(WriteMixin, Progress): + phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') + hide_cursor = True + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/helpers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/helpers.py new file mode 100644 index 0000000..0cde44e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/helpers.py @@ -0,0 +1,91 @@ +# 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 print_function + + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class WriteMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WriteMixin, self).__init__(**kwargs) + self._width = 0 + if message: + self.message = message + + if self.file and self.file.isatty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def write(self, s): + if self.file and self.file.isatty(): + b = '\b' * self._width + c = s.ljust(self._width) + print(b + c, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty() and self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +class WritelnMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WritelnMixin, self).__init__(**kwargs) + if message: + self.message = message + + if self.file and self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file and self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file and self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +from signal import signal, SIGINT +from sys import exit + + +class SigIntMixin(object): + """Registers a signal handler that calls finish on SIGINT""" + + def __init__(self, *args, **kwargs): + super(SigIntMixin, self).__init__(*args, **kwargs) + signal(SIGINT, self._sigint_handler) + + def _sigint_handler(self, signum, frame): + self.finish() + exit(0) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/spinner.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..464c7b2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/progress/spinner.py @@ -0,0 +1,44 @@ +# -*- 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 +from .helpers import WriteMixin + + +class Spinner(WriteMixin, Infinite): + message = '' + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8dc7315 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,3 @@ +from .core import TomlError +from .parser import load, loads +from .writer import dump, dumps diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/core.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/parser.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..9f94e92 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/parser.py @@ -0,0 +1,374 @@ +import string, re, sys, datetime +from .core import TomlError + +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('[bnrt"\'\\\\/f]') +_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): + res.append(_chr(int(s.last().group(1), 16))) + 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)*))?') +_datetime_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +_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(_datetime_re): + m = s.last() + s0 = m.group(0) + 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 + dt = datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + return 'datetime', s0, dt, 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 + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/writer.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..6eaf5d7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/pytoml/writer.py @@ -0,0 +1,127 @@ +from __future__ import unicode_literals +import io, datetime, math, sys + +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) + '"' + + +def _escape_id(s): + if any(not c.isalnum() and c not in '-_' for c in s): + return _escape_string(s) + return s + + +def _format_list(v): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + +# Formula from: +# https://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds +# Once support for py26 is dropped, this can be replaced by td.total_seconds() +def _total_seconds(td): + return ((td.microseconds + + (td.seconds + td.days * 24 * 3600) * 10**6) / 10.0**6) + +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): + offs = v.utcoffset() + offs = _total_seconds(offs) // 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 + elif isinstance(v, list): + return _format_list(v) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..3f3f4f2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,138 @@ +# -*- 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('http://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.23 + assert major == 1 + assert minor >= 21 + assert minor <= 23 + + # 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 ({0}) 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 ({0}) or chardet ({1}) 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 +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__version__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..ef61ec0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.19.1' +__build__ = 0x021901 +__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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/_internal_utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/adapters.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..f6f3f99 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/adapters.py @@ -0,0 +1,530 @@ +# -*- 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 .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) +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 dict((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: {0}".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: {0}".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: {0}".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 proxies: 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 + """ + + conn = self.get_connection(request.url, proxies) + + 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 {0}. 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+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/api.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..a2cc84d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,152 @@ +# -*- 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 or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), 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', 'http://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 or bytes to be sent in the query string for 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 (will be form-encoded), 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 (will be form-encoded), 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 (will be form-encoded), 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/auth.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..4ae4594 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,305 @@ +# -*- 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 ({0!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 ({0!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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/certs.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..ec5d305 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,75 @@ +# -*- 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 + + from pip._vendor.urllib3.packages.ordered_dict import 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/cookies.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..50883a8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,546 @@ +# -*- 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 = dict( + 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. + """ + 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. + """ + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/exceptions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/help.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..df1b4eb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,120 @@ +"""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__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/hooks.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..32b32de --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- 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 dict((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 dict() + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/models.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..4230535 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,952 @@ +# -*- 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 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: dictionary of URL parameters to append to the URL. + :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', 'http://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', 'http://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 dict( + (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=None, 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/packages.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/sessions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..ba13526 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,741 @@ +# -*- 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 +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 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: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + 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 + + # http://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('http://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://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, 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, 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, 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, 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 = dict((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. + + :rtype: Session + """ + + return Session() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/status_codes.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..ff462c6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/structures.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,103 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..431f6be --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,976 @@ +# -*- 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() + + +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('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://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: need more than 1 value to unpack + >>> 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] = 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 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 += ':{0}'.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 + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/retrying.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/six.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/six.py new file mode 100644 index 0000000..6bf4fd3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/six.py @@ -0,0 +1,891 @@ +# Copyright (c) 2010-2017 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.11.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) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..4bd533b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,97 @@ +""" +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 +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.23' + +__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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/_collections.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..6e36b84 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,332 @@ +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 + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connection.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..a03b573 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connection.py @@ -0,0 +1,403 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import sys +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. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``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 in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: 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) + + # Superclass also sets self.source_address in Python 2.7+. + _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 + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # 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 + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + 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, **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 + + # 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, + ) + + +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 getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + 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 + + 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=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 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..8fcb0bc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,906 @@ +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 = set([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.6 + 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 2.6 and older, 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. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self._proxy_host, self.port) + else: + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..59f2a61 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,305 @@ +""" +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 logging +import os +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +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=BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=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 + + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..642e99e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,112 @@ +""" +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 = {} + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..6dd3a01 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,457 @@ +""" +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). + """ + 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 + + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + + name = idna_encode(name) + if 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. + names = [ + ('DNS', _dnsname_to_stdlib(name)) + for name in ext.get_values_for_type(x509.DNSName) + ] + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/exceptions.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/fields.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/filepost.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..75b80dc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- 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) <= set(["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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py new file mode 100644 index 0000000..4479363 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py @@ -0,0 +1,259 @@ +# 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. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ +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={}): + 'od.__repr__() <==> repr(od)' + 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) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/six.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..92c9bc7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,157 @@ +"""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 all the way back to +# python-2.4. +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..506a3c9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,449 @@ +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 +) + +#: 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/request.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..1be3334 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/request.py @@ -0,0 +1,150 @@ +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 = set(['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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/response.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..9873cb9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/response.py @@ -0,0 +1,676 @@ +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, binary_type, 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 = binary_type() + 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 = binary_type() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return 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 ret + raise + data = self._obj.unused_data + if not data: + return ret + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +def _get_decoder(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, binary_type)): + 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 and content_encoding in self.CONTENT_DECODERS: + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/connection.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5cf488f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,126 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read + + +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 + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/queue.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,21 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/request.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/response.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..67cf730 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,81 @@ +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: # Platform-specific: Python 3. + unparsed_data = get_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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/retry.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..7ad3dc6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,411 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..3254280 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,396 @@ +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 and earlier didn'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, six.binary_type): + 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 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + 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): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + 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, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **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) + + # 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 + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + 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. This is not + supported on Python 2.6 as the ssl module does not support it. + :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.6, 2.7, 3.2 + 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, six.binary_type): + # 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/url.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/wait.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..fa686ef --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,153 @@ +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 not None and timeout <= 0: + return 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() + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/labels.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/mklabels.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/tests.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/__init__.py new file mode 100644 index 0000000..6ca68da --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3171 @@ +# 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 +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 has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + 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): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + 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 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 = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, 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(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + 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 = _version_from_file(self._get_metadata(self.PKG_INFO)) + 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/appdirs.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,608 @@ +#!/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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 0000000..892e578 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 0000000..0c8c4a3 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/six.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/extern/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 0000000..c1eb9e9 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/py31compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/py31compat.py new file mode 100644 index 0000000..a381c42 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/INSTALLER b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/LICENSE b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/LICENSE new file mode 100644 index 0000000..6e0693b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/LICENSE @@ -0,0 +1,19 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/METADATA b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/METADATA new file mode 100644 index 0000000..5a5fde1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/METADATA @@ -0,0 +1,73 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 40.6.2 +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://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master + +.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg + :target: https://codecov.io/gh/pypa/setuptools + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +.. image:: https://tidelift.com/badges/github/pypa/setuptools + :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme + +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>`_. + + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/RECORD b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/RECORD new file mode 100644 index 0000000..46bb0bc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/RECORD @@ -0,0 +1,188 @@ +../../Scripts/easy_install-3.6.exe,sha256=CHglPa_yvc6t8L3qULBHFtLf1J4K9gHczSs4w8Tfm8Y,102838 +../../Scripts/easy_install.exe,sha256=CHglPa_yvc6t8L3qULBHFtLf1J4K9gHczSs4w8Tfm8Y,102838 +__pycache__/easy_install.cpython-36.pyc,, +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=d7w_yqCD39lZE0-qxhWXPYoc-pZc3G2mD7EU2xhRLpM,104720 +pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/__pycache__/py31compat.cpython-36.pyc,, +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-36.pyc,, +pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 +pkg_resources/extern/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 +setuptools-40.6.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +setuptools-40.6.2.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 +setuptools-40.6.2.dist-info/METADATA,sha256=xD5qjTNmFccxhrkNSRwX2ksMINOFNLCysl5ESfOrYRE,3092 +setuptools-40.6.2.dist-info/RECORD,, +setuptools-40.6.2.dist-info/WHEEL,sha256=CihQvCnsGZQBGAHLEUMf0IdA4fRduS_NBUTMgCTtvPM,110 +setuptools-40.6.2.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-40.6.2.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-40.6.2.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-40.6.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +setuptools/__init__.py,sha256=ipsF2yFkfHmryPP8ASJEtOj9N9OuYkk8HxxIJyOHtj0,6001 +setuptools/__pycache__/__init__.cpython-36.pyc,, +setuptools/__pycache__/_deprecation_warning.cpython-36.pyc,, +setuptools/__pycache__/archive_util.cpython-36.pyc,, +setuptools/__pycache__/build_meta.cpython-36.pyc,, +setuptools/__pycache__/config.cpython-36.pyc,, +setuptools/__pycache__/dep_util.cpython-36.pyc,, +setuptools/__pycache__/depends.cpython-36.pyc,, +setuptools/__pycache__/dist.cpython-36.pyc,, +setuptools/__pycache__/extension.cpython-36.pyc,, +setuptools/__pycache__/glibc.cpython-36.pyc,, +setuptools/__pycache__/glob.cpython-36.pyc,, +setuptools/__pycache__/launch.cpython-36.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-36.pyc,, +setuptools/__pycache__/monkey.cpython-36.pyc,, +setuptools/__pycache__/msvc.cpython-36.pyc,, +setuptools/__pycache__/namespaces.cpython-36.pyc,, +setuptools/__pycache__/package_index.cpython-36.pyc,, +setuptools/__pycache__/pep425tags.cpython-36.pyc,, +setuptools/__pycache__/py27compat.cpython-36.pyc,, +setuptools/__pycache__/py31compat.cpython-36.pyc,, +setuptools/__pycache__/py33compat.cpython-36.pyc,, +setuptools/__pycache__/py36compat.cpython-36.pyc,, +setuptools/__pycache__/sandbox.cpython-36.pyc,, +setuptools/__pycache__/site-patch.cpython-36.pyc,, +setuptools/__pycache__/ssl_support.cpython-36.pyc,, +setuptools/__pycache__/unicode_utils.cpython-36.pyc,, +setuptools/__pycache__/version.cpython-36.pyc,, +setuptools/__pycache__/wheel.cpython-36.pyc,, +setuptools/__pycache__/windows_support.cpython-36.pyc,, +setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 +setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +setuptools/_vendor/__pycache__/__init__.cpython-36.pyc,, +setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +setuptools/_vendor/__pycache__/six.cpython-36.pyc,, +setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 +setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 +setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 +setuptools/build_meta.py,sha256=qg4RfvgZF1uZPuO1VMioG8JRhNMp5fHrwgpgkYpnzc8,6021 +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/__pycache__/__init__.cpython-36.pyc,, +setuptools/command/__pycache__/alias.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc,, +setuptools/command/__pycache__/build_clib.cpython-36.pyc,, +setuptools/command/__pycache__/build_ext.cpython-36.pyc,, +setuptools/command/__pycache__/build_py.cpython-36.pyc,, +setuptools/command/__pycache__/develop.cpython-36.pyc,, +setuptools/command/__pycache__/dist_info.cpython-36.pyc,, +setuptools/command/__pycache__/easy_install.cpython-36.pyc,, +setuptools/command/__pycache__/egg_info.cpython-36.pyc,, +setuptools/command/__pycache__/install.cpython-36.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-36.pyc,, +setuptools/command/__pycache__/install_lib.cpython-36.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-36.pyc,, +setuptools/command/__pycache__/py36compat.cpython-36.pyc,, +setuptools/command/__pycache__/register.cpython-36.pyc,, +setuptools/command/__pycache__/rotate.cpython-36.pyc,, +setuptools/command/__pycache__/saveopts.cpython-36.pyc,, +setuptools/command/__pycache__/sdist.cpython-36.pyc,, +setuptools/command/__pycache__/setopt.cpython-36.pyc,, +setuptools/command/__pycache__/test.cpython-36.pyc,, +setuptools/command/__pycache__/upload.cpython-36.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-36.pyc,, +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=Sl1iMOORbAnp5BqiXmyMBD0uuvEnhSfOCqbxIPRiJPc,8060 +setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 +setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 +setuptools/command/egg_info.py,sha256=3lsuTHQFjmAw6slzRrB3HjLiF2TaImpWHREllAPhyv8,25541 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=obDTe2BmWt2PlnFPZZh7e0LWvemEsbCCO9MzhrTZjm8,6711 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=fSl5OsZWSmFR3QJRvyy2OxbcYkuIkPvykWNOhFvAcUA,9228 +setuptools/command/upload.py,sha256=BpQCjKtJZ4kEb0qIOiTjlJtbpapmNacC27nG2ZlSxTY,6825 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/config.py,sha256=nCkzIQRWTpVwvtSlFm1kOeSLMMHXmB7hENxwZUT6X9Q,19751 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=HyRYLlPp_gkcnvQf8o1RsGq99LtghAeAfxWxbf40KxA,44675 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 +setuptools/extern/__pycache__/__init__.cpython-36.pyc,, +setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 +setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 +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/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 +setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=yeifZQhJVRwPSaQmRrVPxbXRy-1lF5KdTFV8NAb3YcE,40342 +setuptools/pep425tags.py,sha256=bSGwlybcIpssx9kAv_hqAUJzfEpXSzYRp2u-nDYPdbk,10862 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=REvrUBibUHgqI9S-ww0C9bhU-n8PyaQ8Slr1_NRxaaE,820 +setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 +setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 +setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 +setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 +setuptools/ssl_support.py,sha256=YBDJsCZjSp62CWjxmSkke9kn9rhHHj25Cus6zhJRW3c,8492 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/wheel.py,sha256=A8hKSqHWZ5KM0-VP_DtptxpMxVF9pQwjWZcHGklxq2o,8102 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/WHEEL b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/WHEEL new file mode 100644 index 0000000..dea0e20 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/entry_points.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/entry_points.txt new file mode 100644 index 0000000..4159fd0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/entry_points.txt @@ -0,0 +1,65 @@ +[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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/top_level.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/top_level.txt new file mode 100644 index 0000000..4577c6a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/zip-safe b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools-40.6.2.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/__init__.py new file mode 100644 index 0000000..e438036 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/__init__.py @@ -0,0 +1,195 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import sys +import functools +import distutils.core +import distutils.filelist +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from ._deprecation_warning import SetuptoolsDeprecationWarning + +from setuptools.extern.six import PY3 +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 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_deprecation_warning.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_deprecation_warning.py new file mode 100644 index 0000000..086b64d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_deprecation_warning.py @@ -0,0 +1,7 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__about__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_structures.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/markers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/markers.py new file mode 100644 index 0000000..031332a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/requirements.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/requirements.py new file mode 100644 index 0000000..5b49341 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/six.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/_vendor/six.py @@ -0,0 +1,868 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/archive_util.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000..8143604 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/build_meta.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/build_meta.py new file mode 100644 index 0000000..0067a7a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/build_meta.py @@ -0,0 +1,182 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils + + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + raise SetupRequirementsError(specifiers) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _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 _run_setup(setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + f = getattr(tokenize, 'open', open)(__file__) + code = f.read().replace('\\r\\n', '\\n') + f.close() + exec(compile(code, __file__, 'exec'), locals()) + + +def _fix_config(config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + +def _get_build_requires(config_settings, requirements): + config_settings = _fix_config(config_settings) + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + _run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + +def _get_immediate_subdirectories(a_dir): + return [name for name in os.listdir(a_dir) + if os.path.isdir(os.path.join(a_dir, name))] + + +def get_requires_for_build_wheel(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings, requirements=['setuptools', 'wheel']) + + +def get_requires_for_build_sdist(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings, requirements=['setuptools']) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', _to_str(metadata_directory)] + _run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if len(dist_infos) == 0 and \ + len(_get_immediate_subdirectories(dist_info_directory)) == 1: + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + +def build_wheel(wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = _fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + sys.argv = sys.argv[:1] + ['bdist_wheel'] + \ + config_settings["--global-option"] + _run_setup() + if wheel_directory != 'dist': + shutil.rmtree(wheel_directory) + shutil.copytree('dist', wheel_directory) + + wheels = [f for f in os.listdir(wheel_directory) + if f.endswith('.whl')] + + assert len(wheels) == 1 + return wheels[0] + + +def build_sdist(sdist_directory, config_settings=None): + config_settings = _fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist'] + \ + config_settings["--global-option"] + \ + ["--dist-dir", sdist_directory] + _run_setup() + + sdists = [f for f in os.listdir(sdist_directory) + if f.endswith('.tar.gz')] + + assert len(sdists) == 1 + return sdists[0] diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000..fe619e2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/__init__.py @@ -0,0 +1,18 @@ +__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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/alias.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000..4532b1c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_egg.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000..9f8df91 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,502 @@ +"""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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_rpm.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000..7073092 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_wininst.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000..073de97 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_clib.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_clib.py new file mode 100644 index 0000000..09caff6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_clib.py @@ -0,0 +1,98 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_ext.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000..60a8a32 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,321 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_py.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000..b0314fd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/develop.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000..fdc9fc4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/develop.py @@ -0,0 +1,218 @@ +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 + +from pkg_resources import Distribution, PathMetadata, normalize_path +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 = normalize_path(self.egg_base) + egg_path = normalize_path(os.path.join(self.install_dir, + self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = Distribution( + target, + PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = normalize_path( + os.path.join(install_dir, egg_path, path_to_setup) + ) + if resolved != normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", resolved, normalize_path(os.curdir)) + return path_to_setup + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement: + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/dist_info.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/dist_info.py new file mode 100644 index 0000000..c45258f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,36 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/egg_info.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000..d9fe3da --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,716 @@ +"""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.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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install.py new file mode 100644 index 0000000..31a5ddb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_egg_info.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000..edc4718 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,62 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_lib.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000..2b31c3e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,121 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_scripts.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000..1623427 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/launcher manifest.xml b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000..5972a96 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/py36compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/register.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/register.py new file mode 100644 index 0000000..98bc015 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/register.py @@ -0,0 +1,18 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/rotate.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000..b89353f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/saveopts.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000..611cec5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/sdist.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000..bcfae4d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/sdist.py @@ -0,0 +1,200 @@ +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() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/setopt.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000..7e57cc0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/test.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/test.py new file mode 100644 index 0000000..dde0118 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/test.py @@ -0,0 +1,270 @@ +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 + +__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(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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000..dd17f7a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload.py @@ -0,0 +1,196 @@ +import io +import os +import hashlib +import getpass +import platform + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload_docs.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000..07aa564 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/config.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/config.py new file mode 100644 index 0000000..d1ac673 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/config.py @@ -0,0 +1,635 @@ +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 _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: LICENSE + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value, 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 tranlsated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + 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 + + 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': parse_file, + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + 'project_urls': parse_dict, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dep_util.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dep_util.py new file mode 100644 index 0000000..2931c13 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/depends.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/depends.py new file mode 100644 index 0000000..45e7052 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dist.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dist.py new file mode 100644 index 0000000..7062ae8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/dist.py @@ -0,0 +1,1147 @@ +# -*- coding: utf-8 -*- +__all__ = ['Distribution'] + +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +import itertools + + +from collections import defaultdict +from 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 +from .py36compat import Distribution_parse_config_files + +__import__('setuptools.extern.packaging.specifiers') +__import__('setuptools.extern.packaging.version') + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", 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_parse_config_files, _Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _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, ignore_option_errors=False): + """Parses configuration files from various levels + and loads configuration. + + """ + _Distribution.parse_config_files(self, filenames=filenames) + + parse_configuration(self, self.command_options, + ignore_option_errors=ignore_option_errors) + self._finalize_requires() + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + opts = dist.get_option_dict('easy_install') + opts.clear() + opts.update( + (k, v) + for k, v in self.get_option_dict('easy_install').items() + if k in ( + # don't use any other settings + 'find_links', 'site_dirs', 'index_url', + 'optimize', 'site_dirs', 'allow_hosts', + )) + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1] + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + new = [item for item in value if item not in old] + setattr(self, name, old + new) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + import io + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + msg = ( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65." + ) + warnings.warn(msg, 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extension.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extension.py new file mode 100644 index 0000000..2946889 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extern/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extern/__init__.py new file mode 100644 index 0000000..cb2fa32 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,73 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glibc.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glibc.py new file mode 100644 index 0000000..a134591 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glibc.py @@ -0,0 +1,86 @@ +# 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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glob.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glob.py new file mode 100644 index 0000000..9d7cbc5 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/glob.py @@ -0,0 +1,174 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/launch.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/launch.py new file mode 100644 index 0000000..308283e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/lib2to3_ex.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 0000000..4b1a73f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/monkey.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..3c77f8c --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/monkey.py @@ -0,0 +1,179 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/msvc.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..b9c472f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/msvc.py @@ -0,0 +1,1301 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/namespaces.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..dc16106 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/package_index.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/package_index.py new file mode 100644 index 0000000..1608b91 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/package_index.py @@ -0,0 +1,1128 @@ +"""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 = urllib.parse.splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("(cd %s && git checkout --quiet %s)" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("(cd %s && hg up -C -r %s -q)" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def decode_entity(match): + what = match.group(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""" + + scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url) + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, host = urllib.parse.splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, host, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == host: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ( + "<html><head><title>{url}" + "{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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/pep425tags.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/pep425tags.py new file mode 100644 index 0000000..8bf4277 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/pep425tags.py @@ -0,0 +1,319 @@ +# 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 an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py27compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py27compat.py new file mode 100644 index 0000000..2985011 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py27compat.py @@ -0,0 +1,28 @@ +""" +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py31compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py31compat.py new file mode 100644 index 0000000..1a0705e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py31compat.py @@ -0,0 +1,32 @@ +__all__ = [] + +__metaclass__ = type + + +try: + # Python >=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): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp() + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py33compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..87cf539 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py33compat.py @@ -0,0 +1,55 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py36compat.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py36compat.py new file mode 100644 index 0000000..f527969 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/py36compat.py @@ -0,0 +1,82 @@ +import sys +from distutils.errors import DistutilsOptionError +from distutils.util import strtobool +from distutils.debug import DEBUG + + +class Distribution_parse_config_files: + """ + Mix-in providing forward-compatibility for functionality to be + included by default on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. + """ + def parse_config_files(self, filenames=None): + from configparser import ConfigParser + + # Ignore install directory options if we have a venv + if sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser(interpolation=None) + for filename in filenames: + if DEBUG: + self.announce(" reading %s" % filename) + parser.read(filename) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = parser.get(section,opt) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + +if sys.version_info < (3,): + # Python 2 behavior is sufficient + class Distribution_parse_config_files: + pass + + +if False: + # When updated behavior is available upstream, + # disable override here. + class Distribution_parse_config_files: + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/sandbox.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000..685f3f7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script (dev).tmpl b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000..39a24b0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,6 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +with open(__file__) as f: + exec(compile(f.read(), __file__, 'exec')) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script.tmpl b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000..ff5efbc --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/site-patch.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/site-patch.py new file mode 100644 index 0000000..40b00de --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python 3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/ssl_support.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000..6362f1f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/ssl_support.py @@ -0,0 +1,260 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + if hasattr(ssl, 'create_default_context'): + ctx = ssl.create_default_context(cafile=self.ca_bundle) + self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) + else: + # This is for python < 2.7.9 and < 3.4? + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/unicode_utils.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000..7c63efd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,44 @@ +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/version.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/version.py new file mode 100644 index 0000000..95e1869 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/wheel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/wheel.py new file mode 100644 index 0000000..95a794a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/wheel.py @@ -0,0 +1,210 @@ +"""Wheels support.""" + +from distutils.util import get_platform +import email +import itertools +import os +import posixpath +import re +import zipfile + +from pkg_resources import Distribution, PathMetadata, parse_version +from setuptools.extern.packaging.utils import canonicalize_name +from setuptools.extern.six import PY3 +from setuptools import Distribution as SetuptoolsDistribution +from setuptools import pep425tags +from setuptools.command.egg_info import write_requirements + + +__metaclass__ = type + + +WHEEL_NAME = re.compile( + r"""^(?P.+?)-(?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 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 = Distribution.from_location( + destination_eggdir, dist_info, + metadata=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 = SetuptoolsDistribution( + attrs=dict( + install_requires=install_requires, + extras_require=extras_require, + ), + ) + write_requirements( + setup_dist.get_command_obj('egg_info'), + None, + os.path.join(egg_info, 'requires.txt'), + ) + + @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/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/windows_support.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/INSTALLER b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/LICENSE.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +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/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/METADATA b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/METADATA new file mode 100644 index 0000000..cef8071 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.32.3 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +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 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/RECORD b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/RECORD new file mode 100644 index 0000000..9c841d1 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/RECORD @@ -0,0 +1,34 @@ +../../Scripts/wheel.exe,sha256=blz7jGk16s8aW_WGtMdXgSY_gteeZnYY0Vh1nIFdlDU,102816 +wheel-0.32.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.32.3.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.32.3.dist-info/METADATA,sha256=1gweIMsoaCjJWccLOuQJCZqj_cWYVM80LkUQosJ4wC8,2082 +wheel-0.32.3.dist-info/RECORD,, +wheel-0.32.3.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 +wheel-0.32.3.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.32.3.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel/__init__.py,sha256=AgAP7YAmbZj84_nCH9za8R0UXHylXdfKNSyg5g1xLZ4,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/__pycache__/__init__.cpython-36.pyc,, +wheel/__pycache__/__main__.cpython-36.pyc,, +wheel/__pycache__/bdist_wheel.cpython-36.pyc,, +wheel/__pycache__/metadata.cpython-36.pyc,, +wheel/__pycache__/pep425tags.cpython-36.pyc,, +wheel/__pycache__/pkginfo.cpython-36.pyc,, +wheel/__pycache__/util.cpython-36.pyc,, +wheel/__pycache__/wheelfile.cpython-36.pyc,, +wheel/bdist_wheel.py,sha256=0hM63ZD01ATEMRAr6t0mbmhf2y8pbRkMnWGioed9n-o,14627 +wheel/cli/__init__.py,sha256=DsCXkrL_jsTHoR0nhmcwkrlNdkaXw0uV0NL-yYoYQuU,2461 +wheel/cli/__pycache__/__init__.cpython-36.pyc,, +wheel/cli/__pycache__/convert.cpython-36.pyc,, +wheel/cli/__pycache__/install.cpython-36.pyc,, +wheel/cli/__pycache__/pack.cpython-36.pyc,, +wheel/cli/__pycache__/unpack.cpython-36.pyc,, +wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 +wheel/cli/install.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wheel/cli/pack.py,sha256=RViq4mnUk8s7R5kcrgX0XntX2zalDTeoTSBzLk31SaI,2145 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel/metadata.py,sha256=a3QgT8C4QOvrS-8RFdNCn7XWUUqEZpcHelmI8XLTDnY,4691 +wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=bYkw5oMccfazVCoYQwKkkemoVyMAFoR34mmKBx8R1NI,859 +wheel/wheelfile.py,sha256=mxv8kcRvXMME4xQstpiiQv59bHc42edS6z8kDAco6iw,6990 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/WHEEL b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/WHEEL new file mode 100644 index 0000000..c4bde30 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.3) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/entry_points.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/top_level.txt b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel-0.32.3.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__init__.py new file mode 100644 index 0000000..6938633 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.32.3" diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__main__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/bdist_wheel.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/bdist_wheel.py new file mode 100644 index 0000000..5796970 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/bdist_wheel.py @@ -0,0 +1,368 @@ +""" +Create a wheel (.whl) distribution. + +A wheel is a built archive format. +""" + +import os +import shutil +import sys +import re +from email.generator import Generator +from distutils.core import Command +from distutils.sysconfig import get_python_version +from distutils import log as logger +from glob import iglob +from shutil import rmtree +from warnings import warn + +import pkg_resources + +from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform +from .pkginfo import write_pkg_info +from .metadata import pkginfo_to_metadata +from .wheelfile import WheelFile +from . import pep425tags +from . import __version__ as wheel_version + + +safe_name = pkg_resources.safe_name +safe_version = pkg_resources.safe_version + +PY_LIMITED_API_PATTERN = r'cp3\d' + + +def safer_name(name): + return safe_name(name).replace('-', '_') + + +def safer_version(version): + return safe_version(version).replace('-', '_') + + +class bdist_wheel(Command): + + description = 'create a wheel 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_platform()), + ('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)"), + ('relative', None, + "build the archive using relative paths" + "(default: false)"), + ('owner=', 'u', + "Owner name used when creating a tar file" + " [default: current user]"), + ('group=', 'g', + "Group name used when creating a tar file" + " [default: current group]"), + ('universal', None, + "make a universal wheel" + " (default: false)"), + ('python-tag=', None, + "Python implementation compatibility tag" + " (default: py%s)" % get_impl_ver()[0]), + ('build-number=', None, + "Build number for this particular version. " + "As specified in PEP-0427, this must start with a digit. " + "[default: None]"), + ('py-limited-api=', None, + "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" + " (default: false)"), + ] + + boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] + + def initialize_options(self): + self.bdist_dir = None + self.data_dir = None + self.plat_name = None + self.plat_tag = None + self.format = 'zip' + self.keep_temp = False + self.dist_dir = None + self.egginfo_dir = None + self.root_is_pure = None + self.skip_build = None + self.relative = False + self.owner = None + self.group = None + self.universal = False + self.python_tag = 'py' + get_impl_ver()[0] + self.build_number = None + self.py_limited_api = False + self.plat_name_supplied = False + + def finalize_options(self): + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'wheel') + + self.data_dir = self.wheel_dist_name + '.data' + self.plat_name_supplied = self.plat_name is not None + + need_options = ('dist_dir', 'plat_name', 'skip_build') + + self.set_undefined_options('bdist', + *zip(need_options, need_options)) + + self.root_is_pure = not (self.distribution.has_ext_modules() + or self.distribution.has_c_libraries()) + + if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): + raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) + + # Support legacy [wheel] section for setting universal + wheel = self.distribution.get_option_dict('wheel') + if 'universal' in wheel: + # please don't define this in your global configs + logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.') + val = wheel['universal'][1].strip() + if val.lower() in ('1', 'true', 'yes'): + self.universal = True + + if self.build_number is not None and not self.build_number[:1].isdigit(): + raise ValueError("Build tag (build-number) must start with a digit.") + + @property + def wheel_dist_name(self): + """Return distribution full name with - replaced with _""" + components = (safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + if self.build_number: + components += (self.build_number,) + return '-'.join(components) + + def get_tag(self): + # bdist sets self.plat_name if unset, we should only use it for purepy + # wheels if the user supplied it. + if self.plat_name_supplied: + plat_name = self.plat_name + elif self.root_is_pure: + plat_name = 'any' + else: + plat_name = self.plat_name or get_platform() + if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: + plat_name = 'linux_i686' + plat_name = plat_name.replace('-', '_').replace('.', '_') + + if self.root_is_pure: + if self.universal: + impl = 'py2.py3' + else: + impl = self.python_tag + tag = (impl, 'none', plat_name) + else: + impl_name = get_abbr_impl() + impl_ver = get_impl_ver() + impl = impl_name + impl_ver + # We don't work on CPython 3.1, 3.0. + if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): + impl = self.py_limited_api + abi_tag = 'abi3' + else: + abi_tag = str(get_abi_tag()).lower() + tag = (impl, abi_tag, plat_name) + supported_tags = pep425tags.get_supported( + supplied_platform=plat_name if self.plat_name_supplied else None) + # XXX switch to this alternate implementation for non-pure: + if not self.py_limited_api: + assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) + assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) + return tag + + def run(self): + build_scripts = self.reinitialize_command('build_scripts') + build_scripts.executable = 'python' + + if not self.skip_build: + self.run_command('build') + + install = self.reinitialize_command('install', + reinit_subcommands=True) + install.root = self.bdist_dir + install.compile = False + install.skip_build = self.skip_build + install.warn_dir = False + + # A wheel without setuptools scripts is more cross-platform. + # Use the (undocumented) `no_ep` option to setuptools' + # install_scripts command to avoid creating entry point scripts. + install_scripts = self.reinitialize_command('install_scripts') + install_scripts.no_ep = True + + # Use a custom scheme for the archive, because we have to decide + # at installation time which scheme to use. + for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): + setattr(install, + 'install_' + key, + os.path.join(self.data_dir, key)) + + basedir_observed = '' + + if os.name == 'nt': + # win32 barfs if any of these are ''; could be '.'? + # (distutils.command.install:change_roots bug) + basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) + self.install_libbase = self.install_lib = basedir_observed + + setattr(install, + 'install_purelib' if self.root_is_pure else 'install_platlib', + basedir_observed) + + logger.info("installing to %s", self.bdist_dir) + + self.run_command('install') + + impl_tag, abi_tag, plat_tag = self.get_tag() + archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag) + if not self.relative: + archive_root = self.bdist_dir + else: + archive_root = os.path.join( + self.bdist_dir, + self._ensure_relative(install.install_base)) + + self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir')) + distinfo_dirname = '{}-{}.dist-info'.format( + safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname) + self.egg2dist(self.egginfo_dir, distinfo_dir) + + self.write_wheelfile(distinfo_dir) + + # Make the archive + if not os.path.exists(self.dist_dir): + os.makedirs(self.dist_dir) + + wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl') + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(archive_root) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_wheel', get_python_version(), wheel_path)) + + if not self.keep_temp: + logger.info('removing %s', self.bdist_dir) + if not self.dry_run: + rmtree(self.bdist_dir) + + def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): + from email.message import Message + msg = Message() + msg['Wheel-Version'] = '1.0' # of the spec + msg['Generator'] = generator + msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() + if self.build_number is not None: + msg['Build'] = self.build_number + + # Doesn't work for bdist_wininst + impl_tag, abi_tag, plat_tag = self.get_tag() + for impl in impl_tag.split('.'): + for abi in abi_tag.split('.'): + for plat in plat_tag.split('.'): + msg['Tag'] = '-'.join((impl, abi, plat)) + + wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') + logger.info('creating %s', wheelfile_path) + with open(wheelfile_path, 'w') as f: + Generator(f, maxheaderlen=0).flatten(msg) + + def _ensure_relative(self, path): + # copied from dir_util, deleted + drive, path = os.path.splitdrive(path) + if path[0:1] == os.sep: + path = drive + path[1:] + return path + + @property + def license_paths(self): + metadata = self.distribution.get_option_dict('metadata') + files = set() + patterns = sorted({ + option for option in metadata.get('license_files', ('', ''))[1].split() + }) + + if 'license_file' in metadata: + warn('The "license_file" option is deprecated. Use "license_files" instead.', + DeprecationWarning) + files.add(metadata['license_file'][1]) + + if 'license_file' not in metadata and 'license_files' not in metadata: + patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*') + + for pattern in patterns: + for path in iglob(pattern): + if path not in files and os.path.isfile(path): + logger.info('adding license file "%s" (matched pattern "%s")', path, pattern) + files.add(path) + + return files + + def egg2dist(self, egginfo_path, distinfo_path): + """Convert an .egg-info directory into a .dist-info directory""" + def adios(p): + """Appropriately delete directory, file or link.""" + if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): + shutil.rmtree(p) + elif os.path.exists(p): + os.unlink(p) + + adios(distinfo_path) + + if not os.path.exists(egginfo_path): + # There is no egg-info. This is probably because the egg-info + # file/directory is not named matching the distribution name used + # to name the archive file. Check for this case and report + # accordingly. + import glob + pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') + possible = glob.glob(pat) + err = "Egg metadata expected at %s but not found" % (egginfo_path,) + if possible: + alt = os.path.basename(possible[0]) + err += " (%s found - possible misnamed archive file?)" % (alt,) + + raise ValueError(err) + + if os.path.isfile(egginfo_path): + # .egg-info is a single file + pkginfo_path = egginfo_path + pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path) + os.mkdir(distinfo_path) + else: + # .egg-info is a directory + pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') + pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path) + + # ignore common egg metadata that is useless to wheel + shutil.copytree(egginfo_path, distinfo_path, + ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', + 'not-zip-safe'} + ) + + # delete dependency_links if it is only whitespace + dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') + with open(dependency_links_path, 'r') as dependency_links_file: + dependency_links = dependency_links_file.read().strip() + if not dependency_links: + adios(dependency_links_path) + + write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) + + for license_path in self.license_paths: + filename = os.path.basename(license_path) + shutil.copy(license_path, os.path.join(distinfo_path, filename)) + + adios(egginfo_path) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/__init__.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/__init__.py new file mode 100644 index 0000000..635f40f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/__init__.py @@ -0,0 +1,87 @@ +""" +Wheel command-line utility. +""" + +from __future__ import print_function + +import argparse +import os +import sys + + +def require_pkgresources(name): + try: + import pkg_resources # noqa: F401 + except ImportError: + raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) + + +class WheelError(Exception): + pass + + +def unpack_f(args): + from .unpack import unpack + unpack(args.wheelfile, args.dest) + + +def pack_f(args): + from .pack import pack + pack(args.directory, args.dest_dir) + + +def convert_f(args): + from .convert import convert + convert(args.files, args.dest_dir, args.verbose) + + +def version_f(args): + from .. import __version__ + print("wheel %s" % __version__) + + +def parser(): + p = argparse.ArgumentParser() + s = p.add_subparsers(help="commands") + + unpack_parser = s.add_parser('unpack', help='Unpack wheel') + unpack_parser.add_argument('--dest', '-d', help='Destination directory', + default='.') + unpack_parser.add_argument('wheelfile', help='Wheel file') + unpack_parser.set_defaults(func=unpack_f) + + repack_parser = s.add_parser('pack', help='Repack wheel') + repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') + repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store the wheel (default %(default)s)") + repack_parser.set_defaults(func=pack_f) + + convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') + convert_parser.add_argument('files', nargs='*', help='Files to convert') + convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store wheels (default %(default)s)") + convert_parser.add_argument('--verbose', '-v', action='store_true') + convert_parser.set_defaults(func=convert_f) + + version_parser = s.add_parser('version', help='Print version and exit') + version_parser.set_defaults(func=version_f) + + help_parser = s.add_parser('help', help='Show this help') + help_parser.set_defaults(func=lambda args: p.print_help()) + + return p + + +def main(): + p = parser() + args = p.parse_args() + if not hasattr(args, 'func'): + p.print_help() + else: + try: + args.func(args) + return 0 + except WheelError as e: + print(e, file=sys.stderr) + + return 1 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/convert.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/convert.py new file mode 100644 index 0000000..f1a793a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/convert.py @@ -0,0 +1,269 @@ +import os.path +import re +import shutil +import sys +import tempfile +import zipfile +from distutils import dist +from glob import iglob + +from ..bdist_wheel import bdist_wheel +from ..wheelfile import WheelFile +from . import WheelError, require_pkgresources + +egg_info_re = re.compile(r''' + (?P.+?)-(?P.+?) + (-(?Ppy\d\.\d) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/install.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/install.py new file mode 100644 index 0000000..e69de29 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/pack.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..45c70f2 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/pack.py @@ -0,0 +1,54 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/unpack.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/metadata.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/metadata.py new file mode 100644 index 0000000..3edf6ae --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(parsed_requirement.extras) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pep425tags.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..13b5073 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pep425tags.py @@ -0,0 +1,185 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import get_all_suffixes +except ImportError: + from imp import get_suffixes as get_all_suffixes + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +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_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=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. + """ + 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 = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + 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 platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # 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 diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pkginfo.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/util.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/util.py new file mode 100644 index 0000000..be0aa9b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/util.py @@ -0,0 +1,41 @@ +import base64 +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/wheelfile.py b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..635aa77 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site-packages/wheel/wheelfile.py @@ -0,0 +1,160 @@ +from __future__ import print_function + +import hashlib +import os.path +import re +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = st.st_mode << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + content = '\n'.join('{},{}={},{}'.format(fname, algorithm, hash_, + self._file_sizes[fname]) + for fname, (algorithm, hash_) in self._file_hashes.items()) + content += '\n{},,\n'.format(self.record_path) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(content)) + + ZipFile.close(self) diff --git a/flaskwebproject/FlaskWebProject1/Lib/site.py b/flaskwebproject/FlaskWebProject1/Lib/site.py new file mode 100644 index 0000000..dc9887a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/site.py @@ -0,0 +1,833 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import os +import sys + +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") +_is_jython = sys.platform[:4] == "java" +if _is_jython: + ModuleType = type(os) + + +def makepath(*paths): + dir = os.path.join(*paths) + if _is_jython and (dir == "__classpath__" or dir.startswith("__pyclasspath__")): + return dir, dir + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + if (_is_jython and not isinstance(m, ModuleType)) or hasattr(m, "__loader__"): + # only modules need the abspath in Jython. and don't mess + # with a PEP 302-supplied __file__ + continue + f = getattr(m, "__file__", None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + + s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "r") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ("os2emx", "riscos") or _is_jython: + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, "site-packages")] + elif sys.platform == "darwin" and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [ + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python"), + ] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] + + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), + ] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) + if sys.version[0] == "2": + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [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: + sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ["BEGINLIBPATH"].split(";") + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ["BEGINLIBPATH"] = ";".join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" + else: + eof = "Ctrl-D (i.e. EOF)" + + class Quitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use {}() or {} to exit".format(self.name, eof) + + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "r") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split("\n") + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,) * 2) + + def __call__(self): + self.__setup() + prompt = "Hit Return for more, or q (and Return) to quit: " + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ("", "q"): + key = None + if key == "q": + break + + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_jython: + builtins.credits = _Printer("credits", "Jython is maintained by the Jython developers (www.jython.org).") + elif _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer( + "credits", + """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""", + ) + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", + "See http://www.python.org/%.3s/license.html" % sys.version, + ["LICENSE.txt", "LICENSE"], + [os.path.join(here, os.pardir), here, os.curdir], + ) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " "or help(object) for help about object." + + def __call__(self, *args, **kwds): + import pydoc + + return pydoc.help(*args, **kwds) + + +def sethelper(): + builtins.help = _Helper() + + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == "win32": + import locale, codecs + + enc = locale.getdefaultlocale()[1] + if enc.startswith("cp"): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = "mbcs" + + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == "": + pos += 1 + if _is_jython: + paths = [os.path.join(sys.real_prefix, "Lib")] + elif _is_pypy: + if sys.version_info > (3, 2): + cpyver = "%d" % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = "%d.%d" % sys.version_info[:2] + else: + cpyver = "%d.%d.%d" % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, "plat-%s" % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == "win32": + paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] + else: + paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, "implementation", sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, "lib-tk") + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == "darwin": + hardcoded_paths = [ + os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") + ] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, "__egginsert", 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + + +def fixclasspath(): + """Adjust the special classpath sys.path entries for Jython. These + entries should follow the base virtualenv lib directories. + """ + paths = [] + classpaths = [] + for path in sys.path: + if path == "__classpath__" or path.startswith("__pyclasspath__"): + classpaths.append(path) + else: + paths.append(path) + sys.path = paths + sys.path.extend(classpaths) + + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + abs__file__() + paths_in_sys = removeduppaths() + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": + addbuilddir() + if _is_jython: + fixclasspath() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == "os2emx": + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + + +main() + + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" {!r},".format(dir)) + print("]") + + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_BASE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if "--user-base" in args: + buffer.append(USER_BASE) + if "--user-site" in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + + +if __name__ == "__main__": + _script() diff --git a/flaskwebproject/FlaskWebProject1/Lib/sre_compile.py b/flaskwebproject/FlaskWebProject1/Lib/sre_compile.py new file mode 100644 index 0000000..420d83d --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/sre_compile.py @@ -0,0 +1,580 @@ +# +# Secret Labs' Regular Expression Engine +# +# convert template to internal format +# +# Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. +# +# See the sre.py file for information on usage and redistribution. +# + +"""Internal support module for sre""" + +import _sre +import sre_parse +from sre_constants import * + +assert _sre.MAGIC == MAGIC, "SRE module mismatch" + +_LITERAL_CODES = {LITERAL, NOT_LITERAL} +_REPEATING_CODES = {REPEAT, MIN_REPEAT, MAX_REPEAT} +_SUCCESS_CODES = {SUCCESS, FAILURE} +_ASSERT_CODES = {ASSERT, ASSERT_NOT} + +# Sets of lowercase characters which have the same uppercase. +_equivalences = ( + # LATIN SMALL LETTER I, LATIN SMALL LETTER DOTLESS I + (0x69, 0x131), # iı + # LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S + (0x73, 0x17f), # sſ + # MICRO SIGN, GREEK SMALL LETTER MU + (0xb5, 0x3bc), # µμ + # COMBINING GREEK YPOGEGRAMMENI, GREEK SMALL LETTER IOTA, GREEK PROSGEGRAMMENI + (0x345, 0x3b9, 0x1fbe), # \u0345ιι + # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + (0x390, 0x1fd3), # ΐΐ + # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + (0x3b0, 0x1fe3), # ΰΰ + # GREEK SMALL LETTER BETA, GREEK BETA SYMBOL + (0x3b2, 0x3d0), # βϐ + # GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL + (0x3b5, 0x3f5), # εϵ + # GREEK SMALL LETTER THETA, GREEK THETA SYMBOL + (0x3b8, 0x3d1), # θϑ + # GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL + (0x3ba, 0x3f0), # κϰ + # GREEK SMALL LETTER PI, GREEK PI SYMBOL + (0x3c0, 0x3d6), # πϖ + # GREEK SMALL LETTER RHO, GREEK RHO SYMBOL + (0x3c1, 0x3f1), # ρϱ + # GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA + (0x3c2, 0x3c3), # ςσ + # GREEK SMALL LETTER PHI, GREEK PHI SYMBOL + (0x3c6, 0x3d5), # φϕ + # LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE + (0x1e61, 0x1e9b), # ṡẛ + # LATIN SMALL LIGATURE LONG S T, LATIN SMALL LIGATURE ST + (0xfb05, 0xfb06), # ſtst +) + +# Maps the lowercase code to lowercase codes which have the same uppercase. +_ignorecase_fixes = {i: tuple(j for j in t if i != j) + for t in _equivalences for i in t} + +def _compile(code, pattern, flags): + # internal: compile a (sub)pattern + emit = code.append + _len = len + LITERAL_CODES = _LITERAL_CODES + REPEATING_CODES = _REPEATING_CODES + SUCCESS_CODES = _SUCCESS_CODES + ASSERT_CODES = _ASSERT_CODES + if (flags & SRE_FLAG_IGNORECASE and + not (flags & SRE_FLAG_LOCALE) and + flags & SRE_FLAG_UNICODE and + not (flags & SRE_FLAG_ASCII)): + fixes = _ignorecase_fixes + else: + fixes = None + for op, av in pattern: + if op in LITERAL_CODES: + if flags & SRE_FLAG_IGNORECASE: + lo = _sre.getlower(av, flags) + if fixes and lo in fixes: + emit(IN_IGNORE) + skip = _len(code); emit(0) + if op is NOT_LITERAL: + emit(NEGATE) + for k in (lo,) + fixes[lo]: + emit(LITERAL) + emit(k) + emit(FAILURE) + code[skip] = _len(code) - skip + else: + emit(OP_IGNORE[op]) + emit(lo) + else: + emit(op) + emit(av) + elif op is IN: + if flags & SRE_FLAG_IGNORECASE: + emit(OP_IGNORE[op]) + def fixup(literal, flags=flags): + return _sre.getlower(literal, flags) + else: + emit(op) + fixup = None + skip = _len(code); emit(0) + _compile_charset(av, flags, code, fixup, fixes) + code[skip] = _len(code) - skip + elif op is ANY: + if flags & SRE_FLAG_DOTALL: + emit(ANY_ALL) + else: + emit(ANY) + elif op in REPEATING_CODES: + if flags & SRE_FLAG_TEMPLATE: + raise error("internal: unsupported template operator %r" % (op,)) + elif _simple(av) and op is not REPEAT: + if op is MAX_REPEAT: + emit(REPEAT_ONE) + else: + emit(MIN_REPEAT_ONE) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + emit(SUCCESS) + code[skip] = _len(code) - skip + else: + emit(REPEAT) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + code[skip] = _len(code) - skip + if op is MAX_REPEAT: + emit(MAX_UNTIL) + else: + emit(MIN_UNTIL) + elif op is SUBPATTERN: + group, add_flags, del_flags, p = av + if group: + emit(MARK) + emit((group-1)*2) + # _compile_info(code, p, (flags | add_flags) & ~del_flags) + _compile(code, p, (flags | add_flags) & ~del_flags) + if group: + emit(MARK) + emit((group-1)*2+1) + elif op in SUCCESS_CODES: + emit(op) + elif op in ASSERT_CODES: + emit(op) + skip = _len(code); emit(0) + if av[0] >= 0: + emit(0) # look ahead + else: + lo, hi = av[1].getwidth() + if lo != hi: + raise error("look-behind requires fixed-width pattern") + emit(lo) # look behind + _compile(code, av[1], flags) + emit(SUCCESS) + code[skip] = _len(code) - skip + elif op is CALL: + emit(op) + skip = _len(code); emit(0) + _compile(code, av, flags) + emit(SUCCESS) + code[skip] = _len(code) - skip + elif op is AT: + emit(op) + if flags & SRE_FLAG_MULTILINE: + av = AT_MULTILINE.get(av, av) + if flags & SRE_FLAG_LOCALE: + av = AT_LOCALE.get(av, av) + elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): + av = AT_UNICODE.get(av, av) + emit(av) + elif op is BRANCH: + emit(op) + tail = [] + tailappend = tail.append + for av in av[1]: + skip = _len(code); emit(0) + # _compile_info(code, av, flags) + _compile(code, av, flags) + emit(JUMP) + tailappend(_len(code)); emit(0) + code[skip] = _len(code) - skip + emit(FAILURE) # end of branch + for tail in tail: + code[tail] = _len(code) - tail + elif op is CATEGORY: + emit(op) + if flags & SRE_FLAG_LOCALE: + av = CH_LOCALE[av] + elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): + av = CH_UNICODE[av] + emit(av) + elif op is GROUPREF: + if flags & SRE_FLAG_IGNORECASE: + emit(OP_IGNORE[op]) + else: + emit(op) + emit(av-1) + elif op is GROUPREF_EXISTS: + emit(op) + emit(av[0]-1) + skipyes = _len(code); emit(0) + _compile(code, av[1], flags) + if av[2]: + emit(JUMP) + skipno = _len(code); emit(0) + code[skipyes] = _len(code) - skipyes + 1 + _compile(code, av[2], flags) + code[skipno] = _len(code) - skipno + else: + code[skipyes] = _len(code) - skipyes + 1 + else: + raise error("internal: unsupported operand type %r" % (op,)) + +def _compile_charset(charset, flags, code, fixup=None, fixes=None): + # compile charset subprogram + emit = code.append + for op, av in _optimize_charset(charset, fixup, fixes): + emit(op) + if op is NEGATE: + pass + elif op is LITERAL: + emit(av) + elif op is RANGE or op is RANGE_IGNORE: + emit(av[0]) + emit(av[1]) + elif op is CHARSET: + code.extend(av) + elif op is BIGCHARSET: + code.extend(av) + elif op is CATEGORY: + if flags & SRE_FLAG_LOCALE: + emit(CH_LOCALE[av]) + elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): + emit(CH_UNICODE[av]) + else: + emit(av) + else: + raise error("internal: unsupported set operator %r" % (op,)) + emit(FAILURE) + +def _optimize_charset(charset, fixup, fixes): + # internal: optimize character set + out = [] + tail = [] + charmap = bytearray(256) + for op, av in charset: + while True: + try: + if op is LITERAL: + if fixup: + lo = fixup(av) + charmap[lo] = 1 + if fixes and lo in fixes: + for k in fixes[lo]: + charmap[k] = 1 + else: + charmap[av] = 1 + elif op is RANGE: + r = range(av[0], av[1]+1) + if fixup: + r = map(fixup, r) + if fixup and fixes: + for i in r: + charmap[i] = 1 + if i in fixes: + for k in fixes[i]: + charmap[k] = 1 + else: + for i in r: + charmap[i] = 1 + elif op is NEGATE: + out.append((op, av)) + else: + tail.append((op, av)) + except IndexError: + if len(charmap) == 256: + # character set contains non-UCS1 character codes + charmap += b'\0' * 0xff00 + continue + # Character set contains non-BMP character codes. + # There are only two ranges of cased non-BMP characters: + # 10400-1044F (Deseret) and 118A0-118DF (Warang Citi), + # and for both ranges RANGE_IGNORE works. + if fixup and op is RANGE: + op = RANGE_IGNORE + tail.append((op, av)) + break + + # compress character map + runs = [] + q = 0 + while True: + p = charmap.find(1, q) + if p < 0: + break + if len(runs) >= 2: + runs = None + break + q = charmap.find(0, p) + if q < 0: + runs.append((p, len(charmap))) + break + runs.append((p, q)) + if runs is not None: + # use literal/range + for p, q in runs: + if q - p == 1: + out.append((LITERAL, p)) + else: + out.append((RANGE, (p, q - 1))) + out += tail + # if the case was changed or new representation is more compact + if fixup or len(out) < len(charset): + return out + # else original character set is good enough + return charset + + # use bitmap + if len(charmap) == 256: + data = _mk_bitmap(charmap) + out.append((CHARSET, data)) + out += tail + return out + + # To represent a big charset, first a bitmap of all characters in the + # set is constructed. Then, this bitmap is sliced into chunks of 256 + # characters, duplicate chunks are eliminated, and each chunk is + # given a number. In the compiled expression, the charset is + # represented by a 32-bit word sequence, consisting of one word for + # the number of different chunks, a sequence of 256 bytes (64 words) + # of chunk numbers indexed by their original chunk position, and a + # sequence of 256-bit chunks (8 words each). + + # Compression is normally good: in a typical charset, large ranges of + # Unicode will be either completely excluded (e.g. if only cyrillic + # letters are to be matched), or completely included (e.g. if large + # subranges of Kanji match). These ranges will be represented by + # chunks of all one-bits or all zero-bits. + + # Matching can be also done efficiently: the more significant byte of + # the Unicode character is an index into the chunk number, and the + # less significant byte is a bit index in the chunk (just like the + # CHARSET matching). + + charmap = bytes(charmap) # should be hashable + comps = {} + mapping = bytearray(256) + block = 0 + data = bytearray() + for i in range(0, 65536, 256): + chunk = charmap[i: i + 256] + if chunk in comps: + mapping[i // 256] = comps[chunk] + else: + mapping[i // 256] = comps[chunk] = block + block += 1 + data += chunk + data = _mk_bitmap(data) + data[0:0] = [block] + _bytes_to_codes(mapping) + out.append((BIGCHARSET, data)) + out += tail + return out + +_CODEBITS = _sre.CODESIZE * 8 +MAXCODE = (1 << _CODEBITS) - 1 +_BITS_TRANS = b'0' + b'1' * 255 +def _mk_bitmap(bits, _CODEBITS=_CODEBITS, _int=int): + s = bits.translate(_BITS_TRANS)[::-1] + return [_int(s[i - _CODEBITS: i], 2) + for i in range(len(s), 0, -_CODEBITS)] + +def _bytes_to_codes(b): + # Convert block indices to word array + a = memoryview(b).cast('I') + assert a.itemsize == _sre.CODESIZE + assert len(a) * a.itemsize == len(b) + return a.tolist() + +def _simple(av): + # check if av is a "simple" operator + lo, hi = av[2].getwidth() + return lo == hi == 1 and av[2][0][0] != SUBPATTERN + +def _generate_overlap_table(prefix): + """ + Generate an overlap table for the following prefix. + An overlap table is a table of the same size as the prefix which + informs about the potential self-overlap for each index in the prefix: + - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...] + - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with + prefix[0:k] + """ + table = [0] * len(prefix) + for i in range(1, len(prefix)): + idx = table[i - 1] + while prefix[i] != prefix[idx]: + if idx == 0: + table[i] = 0 + break + idx = table[idx - 1] + else: + table[i] = idx + 1 + return table + +def _get_literal_prefix(pattern): + # look for literal prefix + prefix = [] + prefixappend = prefix.append + prefix_skip = None + for op, av in pattern.data: + if op is LITERAL: + prefixappend(av) + elif op is SUBPATTERN: + group, add_flags, del_flags, p = av + if add_flags & SRE_FLAG_IGNORECASE: + break + prefix1, prefix_skip1, got_all = _get_literal_prefix(p) + if prefix_skip is None: + if group is not None: + prefix_skip = len(prefix) + elif prefix_skip1 is not None: + prefix_skip = len(prefix) + prefix_skip1 + prefix.extend(prefix1) + if not got_all: + break + else: + break + else: + return prefix, prefix_skip, True + return prefix, prefix_skip, False + +def _get_charset_prefix(pattern): + charset = [] # not used + charsetappend = charset.append + if pattern.data: + op, av = pattern.data[0] + if op is SUBPATTERN: + group, add_flags, del_flags, p = av + if p and not (add_flags & SRE_FLAG_IGNORECASE): + op, av = p[0] + if op is LITERAL: + charsetappend((op, av)) + elif op is BRANCH: + c = [] + cappend = c.append + for p in av[1]: + if not p: + break + op, av = p[0] + if op is LITERAL: + cappend((op, av)) + else: + break + else: + charset = c + elif op is BRANCH: + c = [] + cappend = c.append + for p in av[1]: + if not p: + break + op, av = p[0] + if op is LITERAL: + cappend((op, av)) + else: + break + else: + charset = c + elif op is IN: + charset = av + return charset + +def _compile_info(code, pattern, flags): + # internal: compile an info block. in the current version, + # this contains min/max pattern width, and an optional literal + # prefix or a character map + lo, hi = pattern.getwidth() + if hi > MAXCODE: + hi = MAXCODE + if lo == 0: + code.extend([INFO, 4, 0, lo, hi]) + return + # look for a literal prefix + prefix = [] + prefix_skip = 0 + charset = [] # not used + if not (flags & SRE_FLAG_IGNORECASE): + # look for literal prefix + prefix, prefix_skip, got_all = _get_literal_prefix(pattern) + # if no prefix, look for charset prefix + if not prefix: + charset = _get_charset_prefix(pattern) +## if prefix: +## print("*** PREFIX", prefix, prefix_skip) +## if charset: +## print("*** CHARSET", charset) + # add an info block + emit = code.append + emit(INFO) + skip = len(code); emit(0) + # literal flag + mask = 0 + if prefix: + mask = SRE_INFO_PREFIX + if prefix_skip is None and got_all: + mask = mask | SRE_INFO_LITERAL + elif charset: + mask = mask | SRE_INFO_CHARSET + emit(mask) + # pattern length + if lo < MAXCODE: + emit(lo) + else: + emit(MAXCODE) + prefix = prefix[:MAXCODE] + emit(min(hi, MAXCODE)) + # add literal prefix + if prefix: + emit(len(prefix)) # length + if prefix_skip is None: + prefix_skip = len(prefix) + emit(prefix_skip) # skip + code.extend(prefix) + # generate overlap table + code.extend(_generate_overlap_table(prefix)) + elif charset: + _compile_charset(charset, flags, code) + code[skip] = len(code) - skip + +def isstring(obj): + return isinstance(obj, (str, bytes)) + +def _code(p, flags): + + flags = p.pattern.flags | flags + code = [] + + # compile info block + _compile_info(code, p, flags) + + # compile the pattern + _compile(code, p.data, flags) + + code.append(SUCCESS) + + return code + +def compile(p, flags=0): + # internal: convert pattern list to internal format + + if isstring(p): + pattern = p + p = sre_parse.parse(p, flags) + else: + pattern = None + + code = _code(p, flags) + + # print(code) + + # map in either direction + groupindex = p.pattern.groupdict + indexgroup = [None] * p.pattern.groups + for k, i in groupindex.items(): + indexgroup[i] = k + + return _sre.compile( + pattern, flags | p.pattern.flags, code, + p.pattern.groups-1, + groupindex, indexgroup + ) diff --git a/flaskwebproject/FlaskWebProject1/Lib/sre_constants.py b/flaskwebproject/FlaskWebProject1/Lib/sre_constants.py new file mode 100644 index 0000000..a6e8a1f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/sre_constants.py @@ -0,0 +1,233 @@ +# +# Secret Labs' Regular Expression Engine +# +# various symbols used by the regular expression engine. +# run this script to update the _sre include files! +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# See the sre.py file for information on usage and redistribution. +# + +"""Internal support module for sre""" + +# update when constants are added or removed + +MAGIC = 20140917 + +from _sre import MAXREPEAT, MAXGROUPS + +# SRE standard exception (access as sre.error) +# should this really be here? + +class error(Exception): + """Exception raised for invalid regular expressions. + + Attributes: + + msg: The unformatted error message + pattern: The regular expression pattern + pos: The index in the pattern where compilation failed (may be None) + lineno: The line corresponding to pos (may be None) + colno: The column corresponding to pos (may be None) + """ + + def __init__(self, msg, pattern=None, pos=None): + self.msg = msg + self.pattern = pattern + self.pos = pos + if pattern is not None and pos is not None: + msg = '%s at position %d' % (msg, pos) + if isinstance(pattern, str): + newline = '\n' + else: + newline = b'\n' + self.lineno = pattern.count(newline, 0, pos) + 1 + self.colno = pos - pattern.rfind(newline, 0, pos) + if newline in pattern: + msg = '%s (line %d, column %d)' % (msg, self.lineno, self.colno) + else: + self.lineno = self.colno = None + super().__init__(msg) + + +class _NamedIntConstant(int): + def __new__(cls, value, name): + self = super(_NamedIntConstant, cls).__new__(cls, value) + self.name = name + return self + + def __str__(self): + return self.name + + __repr__ = __str__ + +MAXREPEAT = _NamedIntConstant(MAXREPEAT, 'MAXREPEAT') + +def _makecodes(names): + names = names.strip().split() + items = [_NamedIntConstant(i, name) for i, name in enumerate(names)] + globals().update({item.name: item for item in items}) + return items + +# operators +# failure=0 success=1 (just because it looks better that way :-) +OPCODES = _makecodes(""" + FAILURE SUCCESS + + ANY ANY_ALL + ASSERT ASSERT_NOT + AT + BRANCH + CALL + CATEGORY + CHARSET BIGCHARSET + GROUPREF GROUPREF_EXISTS GROUPREF_IGNORE + IN IN_IGNORE + INFO + JUMP + LITERAL LITERAL_IGNORE + MARK + MAX_UNTIL + MIN_UNTIL + NOT_LITERAL NOT_LITERAL_IGNORE + NEGATE + RANGE + REPEAT + REPEAT_ONE + SUBPATTERN + MIN_REPEAT_ONE + RANGE_IGNORE + + MIN_REPEAT MAX_REPEAT +""") +del OPCODES[-2:] # remove MIN_REPEAT and MAX_REPEAT + +# positions +ATCODES = _makecodes(""" + AT_BEGINNING AT_BEGINNING_LINE AT_BEGINNING_STRING + AT_BOUNDARY AT_NON_BOUNDARY + AT_END AT_END_LINE AT_END_STRING + AT_LOC_BOUNDARY AT_LOC_NON_BOUNDARY + AT_UNI_BOUNDARY AT_UNI_NON_BOUNDARY +""") + +# categories +CHCODES = _makecodes(""" + CATEGORY_DIGIT CATEGORY_NOT_DIGIT + CATEGORY_SPACE CATEGORY_NOT_SPACE + CATEGORY_WORD CATEGORY_NOT_WORD + CATEGORY_LINEBREAK CATEGORY_NOT_LINEBREAK + CATEGORY_LOC_WORD CATEGORY_LOC_NOT_WORD + CATEGORY_UNI_DIGIT CATEGORY_UNI_NOT_DIGIT + CATEGORY_UNI_SPACE CATEGORY_UNI_NOT_SPACE + CATEGORY_UNI_WORD CATEGORY_UNI_NOT_WORD + CATEGORY_UNI_LINEBREAK CATEGORY_UNI_NOT_LINEBREAK +""") + + +# replacement operations for "ignore case" mode +OP_IGNORE = { + GROUPREF: GROUPREF_IGNORE, + IN: IN_IGNORE, + LITERAL: LITERAL_IGNORE, + NOT_LITERAL: NOT_LITERAL_IGNORE, + RANGE: RANGE_IGNORE, +} + +AT_MULTILINE = { + AT_BEGINNING: AT_BEGINNING_LINE, + AT_END: AT_END_LINE +} + +AT_LOCALE = { + AT_BOUNDARY: AT_LOC_BOUNDARY, + AT_NON_BOUNDARY: AT_LOC_NON_BOUNDARY +} + +AT_UNICODE = { + AT_BOUNDARY: AT_UNI_BOUNDARY, + AT_NON_BOUNDARY: AT_UNI_NON_BOUNDARY +} + +CH_LOCALE = { + CATEGORY_DIGIT: CATEGORY_DIGIT, + CATEGORY_NOT_DIGIT: CATEGORY_NOT_DIGIT, + CATEGORY_SPACE: CATEGORY_SPACE, + CATEGORY_NOT_SPACE: CATEGORY_NOT_SPACE, + CATEGORY_WORD: CATEGORY_LOC_WORD, + CATEGORY_NOT_WORD: CATEGORY_LOC_NOT_WORD, + CATEGORY_LINEBREAK: CATEGORY_LINEBREAK, + CATEGORY_NOT_LINEBREAK: CATEGORY_NOT_LINEBREAK +} + +CH_UNICODE = { + CATEGORY_DIGIT: CATEGORY_UNI_DIGIT, + CATEGORY_NOT_DIGIT: CATEGORY_UNI_NOT_DIGIT, + CATEGORY_SPACE: CATEGORY_UNI_SPACE, + CATEGORY_NOT_SPACE: CATEGORY_UNI_NOT_SPACE, + CATEGORY_WORD: CATEGORY_UNI_WORD, + CATEGORY_NOT_WORD: CATEGORY_UNI_NOT_WORD, + CATEGORY_LINEBREAK: CATEGORY_UNI_LINEBREAK, + CATEGORY_NOT_LINEBREAK: CATEGORY_UNI_NOT_LINEBREAK +} + +# flags +SRE_FLAG_TEMPLATE = 1 # template mode (disable backtracking) +SRE_FLAG_IGNORECASE = 2 # case insensitive +SRE_FLAG_LOCALE = 4 # honour system locale +SRE_FLAG_MULTILINE = 8 # treat target as multiline string +SRE_FLAG_DOTALL = 16 # treat target as a single string +SRE_FLAG_UNICODE = 32 # use unicode "locale" +SRE_FLAG_VERBOSE = 64 # ignore whitespace and comments +SRE_FLAG_DEBUG = 128 # debugging +SRE_FLAG_ASCII = 256 # use ascii "locale" + +# flags for INFO primitive +SRE_INFO_PREFIX = 1 # has prefix +SRE_INFO_LITERAL = 2 # entire pattern is literal (given by prefix) +SRE_INFO_CHARSET = 4 # pattern starts with character from given set + +if __name__ == "__main__": + def dump(f, d, prefix): + items = sorted(d) + for item in items: + f.write("#define %s_%s %d\n" % (prefix, item, item)) + with open("sre_constants.h", "w") as f: + f.write("""\ +/* + * Secret Labs' Regular Expression Engine + * + * regular expression matching engine + * + * NOTE: This file is generated by sre_constants.py. If you need + * to change anything in here, edit sre_constants.py and run it. + * + * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. + * + * See the _sre.c file for information on usage and redistribution. + */ + +""") + + f.write("#define SRE_MAGIC %d\n" % MAGIC) + + dump(f, OPCODES, "SRE_OP") + dump(f, ATCODES, "SRE") + dump(f, CHCODES, "SRE") + + f.write("#define SRE_FLAG_TEMPLATE %d\n" % SRE_FLAG_TEMPLATE) + f.write("#define SRE_FLAG_IGNORECASE %d\n" % SRE_FLAG_IGNORECASE) + f.write("#define SRE_FLAG_LOCALE %d\n" % SRE_FLAG_LOCALE) + f.write("#define SRE_FLAG_MULTILINE %d\n" % SRE_FLAG_MULTILINE) + f.write("#define SRE_FLAG_DOTALL %d\n" % SRE_FLAG_DOTALL) + f.write("#define SRE_FLAG_UNICODE %d\n" % SRE_FLAG_UNICODE) + f.write("#define SRE_FLAG_VERBOSE %d\n" % SRE_FLAG_VERBOSE) + f.write("#define SRE_FLAG_DEBUG %d\n" % SRE_FLAG_DEBUG) + f.write("#define SRE_FLAG_ASCII %d\n" % SRE_FLAG_ASCII) + + f.write("#define SRE_INFO_PREFIX %d\n" % SRE_INFO_PREFIX) + f.write("#define SRE_INFO_LITERAL %d\n" % SRE_INFO_LITERAL) + f.write("#define SRE_INFO_CHARSET %d\n" % SRE_INFO_CHARSET) + + print("done") diff --git a/flaskwebproject/FlaskWebProject1/Lib/sre_parse.py b/flaskwebproject/FlaskWebProject1/Lib/sre_parse.py new file mode 100644 index 0000000..b505e11 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/sre_parse.py @@ -0,0 +1,973 @@ +# +# Secret Labs' Regular Expression Engine +# +# convert re-style regular expression to sre pattern +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# See the sre.py file for information on usage and redistribution. +# + +"""Internal support module for sre""" + +# XXX: show string offset and offending character for all errors + +from sre_constants import * + +SPECIAL_CHARS = ".\\[{()*+?^$|" +REPEAT_CHARS = "*+?{" + +DIGITS = frozenset("0123456789") + +OCTDIGITS = frozenset("01234567") +HEXDIGITS = frozenset("0123456789abcdefABCDEF") +ASCIILETTERS = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +WHITESPACE = frozenset(" \t\n\r\v\f") + +_REPEATCODES = frozenset({MIN_REPEAT, MAX_REPEAT}) +_UNITCODES = frozenset({ANY, RANGE, IN, LITERAL, NOT_LITERAL, CATEGORY}) + +ESCAPES = { + r"\a": (LITERAL, ord("\a")), + r"\b": (LITERAL, ord("\b")), + r"\f": (LITERAL, ord("\f")), + r"\n": (LITERAL, ord("\n")), + r"\r": (LITERAL, ord("\r")), + r"\t": (LITERAL, ord("\t")), + r"\v": (LITERAL, ord("\v")), + r"\\": (LITERAL, ord("\\")) +} + +CATEGORIES = { + r"\A": (AT, AT_BEGINNING_STRING), # start of string + r"\b": (AT, AT_BOUNDARY), + r"\B": (AT, AT_NON_BOUNDARY), + r"\d": (IN, [(CATEGORY, CATEGORY_DIGIT)]), + r"\D": (IN, [(CATEGORY, CATEGORY_NOT_DIGIT)]), + r"\s": (IN, [(CATEGORY, CATEGORY_SPACE)]), + r"\S": (IN, [(CATEGORY, CATEGORY_NOT_SPACE)]), + r"\w": (IN, [(CATEGORY, CATEGORY_WORD)]), + r"\W": (IN, [(CATEGORY, CATEGORY_NOT_WORD)]), + r"\Z": (AT, AT_END_STRING), # end of string +} + +FLAGS = { + # standard flags + "i": SRE_FLAG_IGNORECASE, + "L": SRE_FLAG_LOCALE, + "m": SRE_FLAG_MULTILINE, + "s": SRE_FLAG_DOTALL, + "x": SRE_FLAG_VERBOSE, + # extensions + "a": SRE_FLAG_ASCII, + "t": SRE_FLAG_TEMPLATE, + "u": SRE_FLAG_UNICODE, +} + +GLOBAL_FLAGS = (SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE | + SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE) + +class Verbose(Exception): + pass + +class Pattern: + # master pattern object. keeps track of global attributes + def __init__(self): + self.flags = 0 + self.groupdict = {} + self.groupwidths = [None] # group 0 + self.lookbehindgroups = None + @property + def groups(self): + return len(self.groupwidths) + def opengroup(self, name=None): + gid = self.groups + self.groupwidths.append(None) + if self.groups > MAXGROUPS: + raise error("too many groups") + if name is not None: + ogid = self.groupdict.get(name, None) + if ogid is not None: + raise error("redefinition of group name %r as group %d; " + "was group %d" % (name, gid, ogid)) + self.groupdict[name] = gid + return gid + def closegroup(self, gid, p): + self.groupwidths[gid] = p.getwidth() + def checkgroup(self, gid): + return gid < self.groups and self.groupwidths[gid] is not None + + def checklookbehindgroup(self, gid, source): + if self.lookbehindgroups is not None: + if not self.checkgroup(gid): + raise source.error('cannot refer to an open group') + if gid >= self.lookbehindgroups: + raise source.error('cannot refer to group defined in the same ' + 'lookbehind subpattern') + +class SubPattern: + # a subpattern, in intermediate form + def __init__(self, pattern, data=None): + self.pattern = pattern + if data is None: + data = [] + self.data = data + self.width = None + def dump(self, level=0): + nl = True + seqtypes = (tuple, list) + for op, av in self.data: + print(level*" " + str(op), end='') + if op is IN: + # member sublanguage + print() + for op, a in av: + print((level+1)*" " + str(op), a) + elif op is BRANCH: + print() + for i, a in enumerate(av[1]): + if i: + print(level*" " + "OR") + a.dump(level+1) + elif op is GROUPREF_EXISTS: + condgroup, item_yes, item_no = av + print('', condgroup) + item_yes.dump(level+1) + if item_no: + print(level*" " + "ELSE") + item_no.dump(level+1) + elif isinstance(av, seqtypes): + nl = False + for a in av: + if isinstance(a, SubPattern): + if not nl: + print() + a.dump(level+1) + nl = True + else: + if not nl: + print(' ', end='') + print(a, end='') + nl = False + if not nl: + print() + else: + print('', av) + def __repr__(self): + return repr(self.data) + def __len__(self): + return len(self.data) + def __delitem__(self, index): + del self.data[index] + def __getitem__(self, index): + if isinstance(index, slice): + return SubPattern(self.pattern, self.data[index]) + return self.data[index] + def __setitem__(self, index, code): + self.data[index] = code + def insert(self, index, code): + self.data.insert(index, code) + def append(self, code): + self.data.append(code) + def getwidth(self): + # determine the width (min, max) for this subpattern + if self.width is not None: + return self.width + lo = hi = 0 + for op, av in self.data: + if op is BRANCH: + i = MAXREPEAT - 1 + j = 0 + for av in av[1]: + l, h = av.getwidth() + i = min(i, l) + j = max(j, h) + lo = lo + i + hi = hi + j + elif op is CALL: + i, j = av.getwidth() + lo = lo + i + hi = hi + j + elif op is SUBPATTERN: + i, j = av[-1].getwidth() + lo = lo + i + hi = hi + j + elif op in _REPEATCODES: + i, j = av[2].getwidth() + lo = lo + i * av[0] + hi = hi + j * av[1] + elif op in _UNITCODES: + lo = lo + 1 + hi = hi + 1 + elif op is GROUPREF: + i, j = self.pattern.groupwidths[av] + lo = lo + i + hi = hi + j + elif op is GROUPREF_EXISTS: + i, j = av[1].getwidth() + if av[2] is not None: + l, h = av[2].getwidth() + i = min(i, l) + j = max(j, h) + else: + i = 0 + lo = lo + i + hi = hi + j + elif op is SUCCESS: + break + self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT) + return self.width + +class Tokenizer: + def __init__(self, string): + self.istext = isinstance(string, str) + self.string = string + if not self.istext: + string = str(string, 'latin1') + self.decoded_string = string + self.index = 0 + self.next = None + self.__next() + def __next(self): + index = self.index + try: + char = self.decoded_string[index] + except IndexError: + self.next = None + return + if char == "\\": + index += 1 + try: + char += self.decoded_string[index] + except IndexError: + raise error("bad escape (end of pattern)", + self.string, len(self.string) - 1) from None + self.index = index + 1 + self.next = char + def match(self, char): + if char == self.next: + self.__next() + return True + return False + def get(self): + this = self.next + self.__next() + return this + def getwhile(self, n, charset): + result = '' + for _ in range(n): + c = self.next + if c not in charset: + break + result += c + self.__next() + return result + def getuntil(self, terminator): + result = '' + while True: + c = self.next + self.__next() + if c is None: + if not result: + raise self.error("missing group name") + raise self.error("missing %s, unterminated name" % terminator, + len(result)) + if c == terminator: + if not result: + raise self.error("missing group name", 1) + break + result += c + return result + @property + def pos(self): + return self.index - len(self.next or '') + def tell(self): + return self.index - len(self.next or '') + def seek(self, index): + self.index = index + self.__next() + + def error(self, msg, offset=0): + return error(msg, self.string, self.tell() - offset) + +def _class_escape(source, escape): + # handle escape code inside character class + code = ESCAPES.get(escape) + if code: + return code + code = CATEGORIES.get(escape) + if code and code[0] is IN: + return code + try: + c = escape[1:2] + if c == "x": + # hexadecimal escape (exactly two digits) + escape += source.getwhile(2, HEXDIGITS) + if len(escape) != 4: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "u" and source.istext: + # unicode escape (exactly four digits) + escape += source.getwhile(4, HEXDIGITS) + if len(escape) != 6: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "U" and source.istext: + # unicode escape (exactly eight digits) + escape += source.getwhile(8, HEXDIGITS) + if len(escape) != 10: + raise source.error("incomplete escape %s" % escape, len(escape)) + c = int(escape[2:], 16) + chr(c) # raise ValueError for invalid code + return LITERAL, c + elif c in OCTDIGITS: + # octal escape (up to three digits) + escape += source.getwhile(2, OCTDIGITS) + c = int(escape[1:], 8) + if c > 0o377: + raise source.error('octal escape value %s outside of ' + 'range 0-0o377' % escape, len(escape)) + return LITERAL, c + elif c in DIGITS: + raise ValueError + if len(escape) == 2: + if c in ASCIILETTERS: + raise source.error('bad escape %s' % escape, len(escape)) + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise source.error("bad escape %s" % escape, len(escape)) + +def _escape(source, escape, state): + # handle escape code in expression + code = CATEGORIES.get(escape) + if code: + return code + code = ESCAPES.get(escape) + if code: + return code + try: + c = escape[1:2] + if c == "x": + # hexadecimal escape + escape += source.getwhile(2, HEXDIGITS) + if len(escape) != 4: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "u" and source.istext: + # unicode escape (exactly four digits) + escape += source.getwhile(4, HEXDIGITS) + if len(escape) != 6: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "U" and source.istext: + # unicode escape (exactly eight digits) + escape += source.getwhile(8, HEXDIGITS) + if len(escape) != 10: + raise source.error("incomplete escape %s" % escape, len(escape)) + c = int(escape[2:], 16) + chr(c) # raise ValueError for invalid code + return LITERAL, c + elif c == "0": + # octal escape + escape += source.getwhile(2, OCTDIGITS) + return LITERAL, int(escape[1:], 8) + elif c in DIGITS: + # octal escape *or* decimal group reference (sigh) + if source.next in DIGITS: + escape += source.get() + if (escape[1] in OCTDIGITS and escape[2] in OCTDIGITS and + source.next in OCTDIGITS): + # got three octal digits; this is an octal escape + escape += source.get() + c = int(escape[1:], 8) + if c > 0o377: + raise source.error('octal escape value %s outside of ' + 'range 0-0o377' % escape, + len(escape)) + return LITERAL, c + # not an octal escape, so this is a group reference + group = int(escape[1:]) + if group < state.groups: + if not state.checkgroup(group): + raise source.error("cannot refer to an open group", + len(escape)) + state.checklookbehindgroup(group, source) + return GROUPREF, group + raise source.error("invalid group reference %d" % group, len(escape) - 1) + if len(escape) == 2: + if c in ASCIILETTERS: + raise source.error("bad escape %s" % escape, len(escape)) + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise source.error("bad escape %s" % escape, len(escape)) + +def _parse_sub(source, state, verbose, nested): + # parse an alternation: a|b|c + + items = [] + itemsappend = items.append + sourcematch = source.match + start = source.tell() + while True: + itemsappend(_parse(source, state, verbose, nested + 1, + not nested and not items)) + if not sourcematch("|"): + break + + if len(items) == 1: + return items[0] + + subpattern = SubPattern(state) + subpatternappend = subpattern.append + + # check if all items share a common prefix + while True: + prefix = None + for item in items: + if not item: + break + if prefix is None: + prefix = item[0] + elif item[0] != prefix: + break + else: + # all subitems start with a common "prefix". + # move it out of the branch + for item in items: + del item[0] + subpatternappend(prefix) + continue # check next one + break + + # check if the branch can be replaced by a character set + for item in items: + if len(item) != 1 or item[0][0] is not LITERAL: + break + else: + # we can store this as a character set instead of a + # branch (the compiler may optimize this even more) + subpatternappend((IN, [item[0] for item in items])) + return subpattern + + subpattern.append((BRANCH, (None, items))) + return subpattern + +def _parse_sub_cond(source, state, condgroup, verbose, nested): + item_yes = _parse(source, state, verbose, nested + 1) + if source.match("|"): + item_no = _parse(source, state, verbose, nested + 1) + if source.next == "|": + raise source.error("conditional backref with more than two branches") + else: + item_no = None + subpattern = SubPattern(state) + subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) + return subpattern + +def _parse(source, state, verbose, nested, first=False): + # parse a simple pattern + subpattern = SubPattern(state) + + # precompute constants into local variables + subpatternappend = subpattern.append + sourceget = source.get + sourcematch = source.match + _len = len + _ord = ord + + while True: + + this = source.next + if this is None: + break # end of pattern + if this in "|)": + break # end of subpattern + sourceget() + + if verbose: + # skip whitespace and comments + if this in WHITESPACE: + continue + if this == "#": + while True: + this = sourceget() + if this is None or this == "\n": + break + continue + + if this[0] == "\\": + code = _escape(source, this, state) + subpatternappend(code) + + elif this not in SPECIAL_CHARS: + subpatternappend((LITERAL, _ord(this))) + + elif this == "[": + here = source.tell() - 1 + # character set + set = [] + setappend = set.append +## if sourcematch(":"): +## pass # handle character classes + if sourcematch("^"): + setappend((NEGATE, None)) + # check remaining characters + start = set[:] + while True: + this = sourceget() + if this is None: + raise source.error("unterminated character set", + source.tell() - here) + if this == "]" and set != start: + break + elif this[0] == "\\": + code1 = _class_escape(source, this) + else: + code1 = LITERAL, _ord(this) + if sourcematch("-"): + # potential range + that = sourceget() + if that is None: + raise source.error("unterminated character set", + source.tell() - here) + if that == "]": + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + setappend((LITERAL, _ord("-"))) + break + if that[0] == "\\": + code2 = _class_escape(source, that) + else: + code2 = LITERAL, _ord(that) + if code1[0] != LITERAL or code2[0] != LITERAL: + msg = "bad character range %s-%s" % (this, that) + raise source.error(msg, len(this) + 1 + len(that)) + lo = code1[1] + hi = code2[1] + if hi < lo: + msg = "bad character range %s-%s" % (this, that) + raise source.error(msg, len(this) + 1 + len(that)) + setappend((RANGE, (lo, hi))) + else: + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + + # XXX: should move set optimization to compiler! + if _len(set)==1 and set[0][0] is LITERAL: + subpatternappend(set[0]) # optimization + elif _len(set)==2 and set[0][0] is NEGATE and set[1][0] is LITERAL: + subpatternappend((NOT_LITERAL, set[1][1])) # optimization + else: + # XXX: should add charmap optimization here + subpatternappend((IN, set)) + + elif this in REPEAT_CHARS: + # repeat previous item + here = source.tell() + if this == "?": + min, max = 0, 1 + elif this == "*": + min, max = 0, MAXREPEAT + + elif this == "+": + min, max = 1, MAXREPEAT + elif this == "{": + if source.next == "}": + subpatternappend((LITERAL, _ord(this))) + continue + min, max = 0, MAXREPEAT + lo = hi = "" + while source.next in DIGITS: + lo += sourceget() + if sourcematch(","): + while source.next in DIGITS: + hi += sourceget() + else: + hi = lo + if not sourcematch("}"): + subpatternappend((LITERAL, _ord(this))) + source.seek(here) + continue + if lo: + min = int(lo) + if min >= MAXREPEAT: + raise OverflowError("the repetition number is too large") + if hi: + max = int(hi) + if max >= MAXREPEAT: + raise OverflowError("the repetition number is too large") + if max < min: + raise source.error("min repeat greater than max repeat", + source.tell() - here) + else: + raise AssertionError("unsupported quantifier %r" % (char,)) + # figure out which item to repeat + if subpattern: + item = subpattern[-1:] + else: + item = None + if not item or (_len(item) == 1 and item[0][0] is AT): + raise source.error("nothing to repeat", + source.tell() - here + len(this)) + if item[0][0] in _REPEATCODES: + raise source.error("multiple repeat", + source.tell() - here + len(this)) + if sourcematch("?"): + subpattern[-1] = (MIN_REPEAT, (min, max, item)) + else: + subpattern[-1] = (MAX_REPEAT, (min, max, item)) + + elif this == ".": + subpatternappend((ANY, None)) + + elif this == "(": + start = source.tell() - 1 + group = True + name = None + condgroup = None + add_flags = 0 + del_flags = 0 + if sourcematch("?"): + # options + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + if char == "P": + # python extensions + if sourcematch("<"): + # named group: skip forward to end of name + name = source.getuntil(">") + if not name.isidentifier(): + msg = "bad character in group name %r" % name + raise source.error(msg, len(name) + 1) + elif sourcematch("="): + # named backreference + name = source.getuntil(")") + if not name.isidentifier(): + msg = "bad character in group name %r" % name + raise source.error(msg, len(name) + 1) + gid = state.groupdict.get(name) + if gid is None: + msg = "unknown group name %r" % name + raise source.error(msg, len(name) + 1) + if not state.checkgroup(gid): + raise source.error("cannot refer to an open group", + len(name) + 1) + state.checklookbehindgroup(gid, source) + subpatternappend((GROUPREF, gid)) + continue + else: + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + raise source.error("unknown extension ?P" + char, + len(char) + 2) + elif char == ":": + # non-capturing group + group = None + elif char == "#": + # comment + while True: + if source.next is None: + raise source.error("missing ), unterminated comment", + source.tell() - start) + if sourceget() == ")": + break + continue + elif char in "=!<": + # lookahead assertions + dir = 1 + if char == "<": + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + if char not in "=!": + raise source.error("unknown extension ?<" + char, + len(char) + 2) + dir = -1 # lookbehind + lookbehindgroups = state.lookbehindgroups + if lookbehindgroups is None: + state.lookbehindgroups = state.groups + p = _parse_sub(source, state, verbose, nested + 1) + if dir < 0: + if lookbehindgroups is None: + state.lookbehindgroups = None + if not sourcematch(")"): + raise source.error("missing ), unterminated subpattern", + source.tell() - start) + if char == "=": + subpatternappend((ASSERT, (dir, p))) + else: + subpatternappend((ASSERT_NOT, (dir, p))) + continue + elif char == "(": + # conditional backreference group + condname = source.getuntil(")") + group = None + if condname.isidentifier(): + condgroup = state.groupdict.get(condname) + if condgroup is None: + msg = "unknown group name %r" % condname + raise source.error(msg, len(condname) + 1) + else: + try: + condgroup = int(condname) + if condgroup < 0: + raise ValueError + except ValueError: + msg = "bad character in group name %r" % condname + raise source.error(msg, len(condname) + 1) from None + if not condgroup: + raise source.error("bad group number", + len(condname) + 1) + if condgroup >= MAXGROUPS: + msg = "invalid group reference %d" % condgroup + raise source.error(msg, len(condname) + 1) + state.checklookbehindgroup(condgroup, source) + elif char in FLAGS or char == "-": + # flags + flags = _parse_flags(source, state, char) + if flags is None: # global flags + if not first or subpattern: + import warnings + warnings.warn( + 'Flags not at the start of the expression %r%s' % ( + source.string[:20], # truncate long regexes + ' (truncated)' if len(source.string) > 20 else '', + ), + DeprecationWarning, stacklevel=nested + 6 + ) + if (state.flags & SRE_FLAG_VERBOSE) and not verbose: + raise Verbose + continue + add_flags, del_flags = flags + group = None + else: + raise source.error("unknown extension ?" + char, + len(char) + 1) + + # parse group contents + if group is not None: + try: + group = state.opengroup(name) + except error as err: + raise source.error(err.msg, len(name) + 1) from None + if condgroup: + p = _parse_sub_cond(source, state, condgroup, verbose, nested + 1) + else: + sub_verbose = ((verbose or (add_flags & SRE_FLAG_VERBOSE)) and + not (del_flags & SRE_FLAG_VERBOSE)) + p = _parse_sub(source, state, sub_verbose, nested + 1) + if not source.match(")"): + raise source.error("missing ), unterminated subpattern", + source.tell() - start) + if group is not None: + state.closegroup(group, p) + subpatternappend((SUBPATTERN, (group, add_flags, del_flags, p))) + + elif this == "^": + subpatternappend((AT, AT_BEGINNING)) + + elif this == "$": + subpattern.append((AT, AT_END)) + + else: + raise AssertionError("unsupported special character %r" % (char,)) + + return subpattern + +def _parse_flags(source, state, char): + sourceget = source.get + add_flags = 0 + del_flags = 0 + if char != "-": + while True: + add_flags |= FLAGS[char] + char = sourceget() + if char is None: + raise source.error("missing -, : or )") + if char in ")-:": + break + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing -, : or )" + raise source.error(msg, len(char)) + if char == ")": + state.flags |= add_flags + return None + if add_flags & GLOBAL_FLAGS: + raise source.error("bad inline flags: cannot turn on global flag", 1) + if char == "-": + char = sourceget() + if char is None: + raise source.error("missing flag") + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing flag" + raise source.error(msg, len(char)) + while True: + del_flags |= FLAGS[char] + char = sourceget() + if char is None: + raise source.error("missing :") + if char == ":": + break + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing :" + raise source.error(msg, len(char)) + assert char == ":" + if del_flags & GLOBAL_FLAGS: + raise source.error("bad inline flags: cannot turn off global flag", 1) + if add_flags & del_flags: + raise source.error("bad inline flags: flag turned on and off", 1) + return add_flags, del_flags + +def fix_flags(src, flags): + # Check and fix flags according to the type of pattern (str or bytes) + if isinstance(src, str): + if flags & SRE_FLAG_LOCALE: + raise ValueError("cannot use LOCALE flag with a str pattern") + if not flags & SRE_FLAG_ASCII: + flags |= SRE_FLAG_UNICODE + elif flags & SRE_FLAG_UNICODE: + raise ValueError("ASCII and UNICODE flags are incompatible") + else: + if flags & SRE_FLAG_UNICODE: + raise ValueError("cannot use UNICODE flag with a bytes pattern") + if flags & SRE_FLAG_LOCALE and flags & SRE_FLAG_ASCII: + raise ValueError("ASCII and LOCALE flags are incompatible") + return flags + +def parse(str, flags=0, pattern=None): + # parse 're' pattern into list of (opcode, argument) tuples + + source = Tokenizer(str) + + if pattern is None: + pattern = Pattern() + pattern.flags = flags + pattern.str = str + + try: + p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0) + except Verbose: + # the VERBOSE flag was switched on inside the pattern. to be + # on the safe side, we'll parse the whole thing again... + pattern = Pattern() + pattern.flags = flags | SRE_FLAG_VERBOSE + pattern.str = str + source.seek(0) + p = _parse_sub(source, pattern, True, 0) + + p.pattern.flags = fix_flags(str, p.pattern.flags) + + if source.next is not None: + assert source.next == ")" + raise source.error("unbalanced parenthesis") + + if flags & SRE_FLAG_DEBUG: + p.dump() + + return p + +def parse_template(source, pattern): + # parse 're' replacement string into list of literals and + # group references + s = Tokenizer(source) + sget = s.get + groups = [] + literals = [] + literal = [] + lappend = literal.append + def addgroup(index, pos): + if index > pattern.groups: + raise s.error("invalid group reference %d" % index, pos) + if literal: + literals.append(''.join(literal)) + del literal[:] + groups.append((len(literals), index)) + literals.append(None) + groupindex = pattern.groupindex + while True: + this = sget() + if this is None: + break # end of replacement string + if this[0] == "\\": + # group + c = this[1] + if c == "g": + name = "" + if not s.match("<"): + raise s.error("missing <") + name = s.getuntil(">") + if name.isidentifier(): + try: + index = groupindex[name] + except KeyError: + raise IndexError("unknown group name %r" % name) + else: + try: + index = int(name) + if index < 0: + raise ValueError + except ValueError: + raise s.error("bad character in group name %r" % name, + len(name) + 1) from None + if index >= MAXGROUPS: + raise s.error("invalid group reference %d" % index, + len(name) + 1) + addgroup(index, len(name) + 1) + elif c == "0": + if s.next in OCTDIGITS: + this += sget() + if s.next in OCTDIGITS: + this += sget() + lappend(chr(int(this[1:], 8) & 0xff)) + elif c in DIGITS: + isoctal = False + if s.next in DIGITS: + this += sget() + if (c in OCTDIGITS and this[2] in OCTDIGITS and + s.next in OCTDIGITS): + this += sget() + isoctal = True + c = int(this[1:], 8) + if c > 0o377: + raise s.error('octal escape value %s outside of ' + 'range 0-0o377' % this, len(this)) + lappend(chr(c)) + if not isoctal: + addgroup(int(this[1:]), len(this) - 1) + else: + try: + this = chr(ESCAPES[this][1]) + except KeyError: + if c in ASCIILETTERS: + import warnings + warnings.warn('bad escape %s' % this, + DeprecationWarning, stacklevel=4) + lappend(this) + else: + lappend(this) + if literal: + literals.append(''.join(literal)) + if not isinstance(source, str): + # The tokenizer implicitly decodes bytes objects as latin-1, we must + # therefore re-encode the final representation. + literals = [None if s is None else s.encode('latin-1') for s in literals] + return groups, literals + +def expand_template(template, match): + g = match.group + empty = match.string[:0] + groups, literals = template + literals = literals[:] + try: + for index, group in groups: + literals[index] = g(group) or empty + except IndexError: + raise error("invalid group reference %d" % index) + return empty.join(literals) diff --git a/flaskwebproject/FlaskWebProject1/Lib/stat.py b/flaskwebproject/FlaskWebProject1/Lib/stat.py new file mode 100644 index 0000000..46837c0 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/stat.py @@ -0,0 +1,178 @@ +"""Constants/functions for interpreting results of os.stat() and os.lstat(). + +Suggested usage: from stat import * +""" + +# Indices for stat struct members in the tuple returned by os.stat() + +ST_MODE = 0 +ST_INO = 1 +ST_DEV = 2 +ST_NLINK = 3 +ST_UID = 4 +ST_GID = 5 +ST_SIZE = 6 +ST_ATIME = 7 +ST_MTIME = 8 +ST_CTIME = 9 + +# Extract bits from the mode + +def S_IMODE(mode): + """Return the portion of the file's mode that can be set by + os.chmod(). + """ + return mode & 0o7777 + +def S_IFMT(mode): + """Return the portion of the file's mode that describes the + file type. + """ + return mode & 0o170000 + +# Constants used as S_IFMT() for various file types +# (not all are implemented on all systems) + +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFBLK = 0o060000 # block device +S_IFREG = 0o100000 # regular file +S_IFIFO = 0o010000 # fifo (named pipe) +S_IFLNK = 0o120000 # symbolic link +S_IFSOCK = 0o140000 # socket file + +# Functions to test for each file type + +def S_ISDIR(mode): + """Return True if mode is from a directory.""" + return S_IFMT(mode) == S_IFDIR + +def S_ISCHR(mode): + """Return True if mode is from a character special device file.""" + return S_IFMT(mode) == S_IFCHR + +def S_ISBLK(mode): + """Return True if mode is from a block special device file.""" + return S_IFMT(mode) == S_IFBLK + +def S_ISREG(mode): + """Return True if mode is from a regular file.""" + return S_IFMT(mode) == S_IFREG + +def S_ISFIFO(mode): + """Return True if mode is from a FIFO (named pipe).""" + return S_IFMT(mode) == S_IFIFO + +def S_ISLNK(mode): + """Return True if mode is from a symbolic link.""" + return S_IFMT(mode) == S_IFLNK + +def S_ISSOCK(mode): + """Return True if mode is from a socket.""" + return S_IFMT(mode) == S_IFSOCK + +# Names for permission bits + +S_ISUID = 0o4000 # set UID bit +S_ISGID = 0o2000 # set GID bit +S_ENFMT = S_ISGID # file locking enforcement +S_ISVTX = 0o1000 # sticky bit +S_IREAD = 0o0400 # Unix V7 synonym for S_IRUSR +S_IWRITE = 0o0200 # Unix V7 synonym for S_IWUSR +S_IEXEC = 0o0100 # Unix V7 synonym for S_IXUSR +S_IRWXU = 0o0700 # mask for owner permissions +S_IRUSR = 0o0400 # read by owner +S_IWUSR = 0o0200 # write by owner +S_IXUSR = 0o0100 # execute by owner +S_IRWXG = 0o0070 # mask for group permissions +S_IRGRP = 0o0040 # read by group +S_IWGRP = 0o0020 # write by group +S_IXGRP = 0o0010 # execute by group +S_IRWXO = 0o0007 # mask for others (not in group) permissions +S_IROTH = 0o0004 # read by others +S_IWOTH = 0o0002 # write by others +S_IXOTH = 0o0001 # execute by others + +# Names for file flags + +UF_NODUMP = 0x00000001 # do not dump file +UF_IMMUTABLE = 0x00000002 # file may not be changed +UF_APPEND = 0x00000004 # file may only be appended to +UF_OPAQUE = 0x00000008 # directory is opaque when viewed through a union stack +UF_NOUNLINK = 0x00000010 # file may not be renamed or deleted +UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed +UF_HIDDEN = 0x00008000 # OS X: file should not be displayed +SF_ARCHIVED = 0x00010000 # file may be archived +SF_IMMUTABLE = 0x00020000 # file may not be changed +SF_APPEND = 0x00040000 # file may only be appended to +SF_NOUNLINK = 0x00100000 # file may not be renamed or deleted +SF_SNAPSHOT = 0x00200000 # file is a snapshot file + + +_filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((S_IRUSR, "r"),), + ((S_IWUSR, "w"),), + ((S_IXUSR|S_ISUID, "s"), + (S_ISUID, "S"), + (S_IXUSR, "x")), + + ((S_IRGRP, "r"),), + ((S_IWGRP, "w"),), + ((S_IXGRP|S_ISGID, "s"), + (S_ISGID, "S"), + (S_IXGRP, "x")), + + ((S_IROTH, "r"),), + ((S_IWOTH, "w"),), + ((S_IXOTH|S_ISVTX, "t"), + (S_ISVTX, "T"), + (S_IXOTH, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form '-rwxrwxrwx'.""" + 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) + + +# Windows FILE_ATTRIBUTE constants for interpreting os.stat()'s +# "st_file_attributes" member + +FILE_ATTRIBUTE_ARCHIVE = 32 +FILE_ATTRIBUTE_COMPRESSED = 2048 +FILE_ATTRIBUTE_DEVICE = 64 +FILE_ATTRIBUTE_DIRECTORY = 16 +FILE_ATTRIBUTE_ENCRYPTED = 16384 +FILE_ATTRIBUTE_HIDDEN = 2 +FILE_ATTRIBUTE_INTEGRITY_STREAM = 32768 +FILE_ATTRIBUTE_NORMAL = 128 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192 +FILE_ATTRIBUTE_NO_SCRUB_DATA = 131072 +FILE_ATTRIBUTE_OFFLINE = 4096 +FILE_ATTRIBUTE_READONLY = 1 +FILE_ATTRIBUTE_REPARSE_POINT = 1024 +FILE_ATTRIBUTE_SPARSE_FILE = 512 +FILE_ATTRIBUTE_SYSTEM = 4 +FILE_ATTRIBUTE_TEMPORARY = 256 +FILE_ATTRIBUTE_VIRTUAL = 65536 + + +# If available, use C implementation +try: + from _stat import * +except ImportError: + pass diff --git a/flaskwebproject/FlaskWebProject1/Lib/struct.py b/flaskwebproject/FlaskWebProject1/Lib/struct.py new file mode 100644 index 0000000..d6bba58 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/struct.py @@ -0,0 +1,15 @@ +__all__ = [ + # Functions + 'calcsize', 'pack', 'pack_into', 'unpack', 'unpack_from', + 'iter_unpack', + + # Classes + 'Struct', + + # Exceptions + 'error' + ] + +from _struct import * +from _struct import _clearcache +from _struct import __doc__ diff --git a/flaskwebproject/FlaskWebProject1/Lib/tcl8.6/init.tcl b/flaskwebproject/FlaskWebProject1/Lib/tcl8.6/init.tcl new file mode 100644 index 0000000..9ca4514 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/tcl8.6/init.tcl @@ -0,0 +1,818 @@ +# init.tcl -- +# +# Default system startup file for Tcl-based applications. Defines +# "unknown" procedure and auto-load facilities. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 Scriptics Corporation. +# Copyright (c) 2004 by Kevin B. Kenny. All rights reserved. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# This test intentionally written in pre-7.5 Tcl +if {[info commands package] == ""} { + error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" +} +package require -exact Tcl 8.6.6 + +# Compute the auto path to use in this interpreter. +# The values on the path come from several locations: +# +# The environment variable TCLLIBPATH +# +# tcl_library, which is the directory containing this init.tcl script. +# [tclInit] (Tcl_Init()) searches around for the directory containing this +# init.tcl and defines tcl_library to that location before sourcing it. +# +# The parent directory of tcl_library. Adding the parent +# means that packages in peer directories will be found automatically. +# +# Also add the directory ../lib relative to the directory where the +# executable is located. This is meant to find binary packages for the +# same architecture as the current executable. +# +# tcl_pkgPath, which is set by the platform-specific initialization routines +# On UNIX it is compiled in +# On Windows, it is not used + +if {![info exists auto_path]} { + if {[info exists env(TCLLIBPATH)]} { + set auto_path $env(TCLLIBPATH) + } else { + set auto_path "" + } +} +namespace eval tcl { + variable Dir + foreach Dir [list $::tcl_library [file dirname $::tcl_library]] { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + set Dir [file join [file dirname [file dirname \ + [info nameofexecutable]]] lib] + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + catch { + foreach Dir $::tcl_pkgPath { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + } + + if {![interp issafe]} { + variable Path [encoding dirs] + set Dir [file join $::tcl_library encoding] + if {$Dir ni $Path} { + lappend Path $Dir + encoding dirs $Path + } + } + + # TIP #255 min and max functions + namespace eval mathfunc { + proc min {args} { + if {![llength $args]} { + return -code error \ + "too few arguments to math function \"min\"" + } + set val Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg < $val} {set val $arg} + } + return $val + } + proc max {args} { + if {![llength $args]} { + return -code error \ + "too few arguments to math function \"max\"" + } + set val -Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg > $val} {set val $arg} + } + return $val + } + namespace export min max + } +} + +# Windows specific end of initialization + +if {(![interp issafe]) && ($tcl_platform(platform) eq "windows")} { + namespace eval tcl { + proc EnvTraceProc {lo n1 n2 op} { + global env + set x $env($n2) + set env($lo) $x + set env([string toupper $lo]) $x + } + proc InitWinEnv {} { + global env tcl_platform + foreach p [array names env] { + set u [string toupper $p] + if {$u ne $p} { + switch -- $u { + COMSPEC - + PATH { + set temp $env($p) + unset env($p) + set env($u) $temp + trace add variable env($p) write \ + [namespace code [list EnvTraceProc $p]] + trace add variable env($u) write \ + [namespace code [list EnvTraceProc $p]] + } + } + } + } + if {![info exists env(COMSPEC)]} { + set env(COMSPEC) cmd.exe + } + } + InitWinEnv + } +} + +# Setup the unknown package handler + + +if {[interp issafe]} { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} +} else { + # Set up search for Tcl Modules (TIP #189). + # and setup platform specific unknown package handlers + if {$tcl_platform(os) eq "Darwin" + && $tcl_platform(platform) eq "unix"} { + package unknown {::tcl::tm::UnknownHandler \ + {::tcl::MacOSXPkgUnknown ::tclPkgUnknown}} + } else { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} + } + + # Set up the 'clock' ensemble + + namespace eval ::tcl::clock [list variable TclLibDir $::tcl_library] + + proc clock args { + namespace eval ::tcl::clock [list namespace ensemble create -command \ + [uplevel 1 [list namespace origin [lindex [info level 0] 0]]] \ + -subcommands { + add clicks format microseconds milliseconds scan seconds + }] + + # Auto-loading stubs for 'clock.tcl' + + foreach cmd {add format scan} { + proc ::tcl::clock::$cmd args { + variable TclLibDir + source -encoding utf-8 [file join $TclLibDir clock.tcl] + return [uplevel 1 [info level 0]] + } + } + + return [uplevel 1 [info level 0]] + } +} + +# Conditionalize for presence of exec. + +if {[namespace which -command exec] eq ""} { + + # Some machines do not have exec. Also, on all + # platforms, safe interpreters do not have exec. + + set auto_noexec 1 +} + +# Define a log command (which can be overwitten to log errors +# differently, specially when stderr is not available) + +if {[namespace which -command tclLog] eq ""} { + proc tclLog {string} { + catch {puts stderr $string} + } +} + +# unknown -- +# This procedure is called when a Tcl command is invoked that doesn't +# exist in the interpreter. It takes the following steps to make the +# command available: +# +# 1. See if the autoload facility can locate the command in a +# Tcl script file. If so, load it and execute it. +# 2. If the command was invoked interactively at top-level: +# (a) see if the command exists as an executable UNIX program. +# If so, "exec" the command. +# (b) see if the command requests csh-like history substitution +# in one of the common forms !!, !, or ^old^new. If +# so, emulate csh's history substitution. +# (c) see if the command is a unique abbreviation for another +# command. If so, invoke the command. +# +# Arguments: +# args - A list whose elements are the words of the original +# command, including the command name. + +proc unknown args { + variable ::tcl::UnknownPending + global auto_noexec auto_noload env tcl_interactive errorInfo errorCode + + if {[info exists errorInfo]} { + set savedErrorInfo $errorInfo + } + if {[info exists errorCode]} { + set savedErrorCode $errorCode + } + + set name [lindex $args 0] + if {![info exists auto_noload]} { + # + # Make sure we're not trying to load the same proc twice. + # + if {[info exists UnknownPending($name)]} { + return -code error "self-referential recursion\ + in \"unknown\" for command \"$name\"" + } + set UnknownPending($name) pending + set ret [catch { + auto_load $name [uplevel 1 {::namespace current}] + } msg opts] + unset UnknownPending($name) + if {$ret != 0} { + dict append opts -errorinfo "\n (autoloading \"$name\")" + return -options $opts $msg + } + if {![array size UnknownPending]} { + unset UnknownPending + } + if {$msg} { + if {[info exists savedErrorCode]} { + set ::errorCode $savedErrorCode + } else { + unset -nocomplain ::errorCode + } + if {[info exists savedErrorInfo]} { + set errorInfo $savedErrorInfo + } else { + unset -nocomplain errorInfo + } + set code [catch {uplevel 1 $args} msg opts] + if {$code == 1} { + # + # Compute stack trace contribution from the [uplevel]. + # Note the dependence on how Tcl_AddErrorInfo, etc. + # construct the stack trace. + # + set errInfo [dict get $opts -errorinfo] + set errCode [dict get $opts -errorcode] + set cinfo $args + if {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 150] + while {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 end-1] + } + append cinfo ... + } + append cinfo "\"\n (\"uplevel\" body line 1)" + append cinfo "\n invoked from within" + append cinfo "\n\"uplevel 1 \$args\"" + # + # Try each possible form of the stack trace + # and trim the extra contribution from the matching case + # + set expect "$msg\n while executing\n\"$cinfo" + if {$errInfo eq $expect} { + # + # The stack has only the eval from the expanded command + # Do not generate any stack trace here. + # + dict unset opts -errorinfo + dict incr opts -level + return -options $opts $msg + } + # + # Stack trace is nested, trim off just the contribution + # from the extra "eval" of $args due to the "catch" above. + # + set expect "\n invoked from within\n\"$cinfo" + set exlen [string length $expect] + set eilen [string length $errInfo] + set i [expr {$eilen - $exlen - 1}] + set einfo [string range $errInfo 0 $i] + # + # For now verify that $errInfo consists of what we are about + # to return plus what we expected to trim off. + # + if {$errInfo ne "$einfo$expect"} { + error "Tcl bug: unexpected stack trace in \"unknown\"" {} \ + [list CORE UNKNOWN BADTRACE $einfo $expect $errInfo] + } + return -code error -errorcode $errCode \ + -errorinfo $einfo $msg + } else { + dict incr opts -level + return -options $opts $msg + } + } + } + + if {([info level] == 1) && ([info script] eq "") + && [info exists tcl_interactive] && $tcl_interactive} { + if {![info exists auto_noexec]} { + set new [auto_execok $name] + if {$new ne ""} { + set redir "" + if {[namespace which -command console] eq ""} { + set redir ">&@stdout <@stdin" + } + uplevel 1 [list ::catch \ + [concat exec $redir $new [lrange $args 1 end]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + } + if {$name eq "!!"} { + set newcmd [history event] + } elseif {[regexp {^!(.+)$} $name -> event]} { + set newcmd [history event $event] + } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { + set newcmd [history event -1] + catch {regsub -all -- $old $newcmd $new newcmd} + } + if {[info exists newcmd]} { + tclLog $newcmd + history change $newcmd 0 + uplevel 1 [list ::catch $newcmd \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + + set ret [catch {set candidates [info commands $name*]} msg] + if {$name eq "::"} { + set name "" + } + if {$ret != 0} { + dict append opts -errorinfo \ + "\n (expanding command prefix \"$name\" in unknown)" + return -options $opts $msg + } + # Filter out bogus matches when $name contained + # a glob-special char [Bug 946952] + if {$name eq ""} { + # Handle empty $name separately due to strangeness + # in [string first] (See RFE 1243354) + set cmds $candidates + } else { + set cmds [list] + foreach x $candidates { + if {[string first $name $x] == 0} { + lappend cmds $x + } + } + } + if {[llength $cmds] == 1} { + uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + if {[llength $cmds]} { + return -code error "ambiguous command name \"$name\": [lsort $cmds]" + } + } + return -code error -errorcode [list TCL LOOKUP COMMAND $name] \ + "invalid command name \"$name\"" +} + +# auto_load -- +# Checks a collection of library directories to see if a procedure +# is defined in one of them. If so, it sources the appropriate +# library file to create the procedure. Returns 1 if it successfully +# loaded the procedure, 0 otherwise. +# +# Arguments: +# cmd - Name of the command to find and load. +# namespace (optional) The namespace where the command is being used - must be +# a canonical namespace as returned [namespace current] +# for instance. If not given, namespace current is used. + +proc auto_load {cmd {namespace {}}} { + global auto_index auto_path + + if {$namespace eq ""} { + set namespace [uplevel 1 [list ::namespace current]] + } + set nameList [auto_qualify $cmd $namespace] + # workaround non canonical auto_index entries that might be around + # from older auto_mkindex versions + lappend nameList $cmd + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + # There's a couple of ways to look for a command of a given + # name. One is to use + # info commands $name + # Unfortunately, if the name has glob-magic chars in it like * + # or [], it may not match. For our purposes here, a better + # route is to use + # namespace which -command $name + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + if {![info exists auto_path]} { + return 0 + } + + if {![auto_load_index]} { + return 0 + } + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + return 0 +} + +# auto_load_index -- +# Loads the contents of tclIndex files on the auto_path directory +# list. This is usually invoked within auto_load to load the index +# of available commands. Returns 1 if the index is loaded, and 0 if +# the index is already loaded and up to date. +# +# Arguments: +# None. + +proc auto_load_index {} { + variable ::tcl::auto_oldpath + global auto_index auto_path + + if {[info exists auto_oldpath] && ($auto_oldpath eq $auto_path)} { + return 0 + } + set auto_oldpath $auto_path + + # Check if we are a safe interpreter. In that case, we support only + # newer format tclIndex files. + + set issafe [interp issafe] + for {set i [expr {[llength $auto_path] - 1}]} {$i >= 0} {incr i -1} { + set dir [lindex $auto_path $i] + set f "" + if {$issafe} { + catch {source [file join $dir tclIndex]} + } elseif {[catch {set f [open [file join $dir tclIndex]]}]} { + continue + } else { + set error [catch { + set id [gets $f] + if {$id eq "# Tcl autoload index file, version 2.0"} { + eval [read $f] + } elseif {$id eq "# Tcl autoload index file: each line identifies a Tcl"} { + while {[gets $f line] >= 0} { + if {([string index $line 0] eq "#") \ + || ([llength $line] != 2)} { + continue + } + set name [lindex $line 0] + set auto_index($name) \ + "source [file join $dir [lindex $line 1]]" + } + } else { + error "[file join $dir tclIndex] isn't a proper Tcl index file" + } + } msg opts] + if {$f ne ""} { + close $f + } + if {$error} { + return -options $opts $msg + } + } + } + return 1 +} + +# auto_qualify -- +# +# Compute a fully qualified names list for use in the auto_index array. +# For historical reasons, commands in the global namespace do not have leading +# :: in the index key. The list has two elements when the command name is +# relative (no leading ::) and the namespace is not the global one. Otherwise +# only one name is returned (and searched in the auto_index). +# +# Arguments - +# cmd The command name. Can be any name accepted for command +# invocations (Like "foo::::bar"). +# namespace The namespace where the command is being used - must be +# a canonical namespace as returned by [namespace current] +# for instance. + +proc auto_qualify {cmd namespace} { + + # count separators and clean them up + # (making sure that foo:::::bar will be treated as foo::bar) + set n [regsub -all {::+} $cmd :: cmd] + + # Ignore namespace if the name starts with :: + # Handle special case of only leading :: + + # Before each return case we give an example of which category it is + # with the following form : + # (inputCmd, inputNameSpace) -> output + + if {[string match ::* $cmd]} { + if {$n > 1} { + # (::foo::bar , *) -> ::foo::bar + return [list $cmd] + } else { + # (::global , *) -> global + return [list [string range $cmd 2 end]] + } + } + + # Potentially returning 2 elements to try : + # (if the current namespace is not the global one) + + if {$n == 0} { + if {$namespace eq "::"} { + # (nocolons , ::) -> nocolons + return [list $cmd] + } else { + # (nocolons , ::sub) -> ::sub::nocolons nocolons + return [list ${namespace}::$cmd $cmd] + } + } elseif {$namespace eq "::"} { + # (foo::bar , ::) -> ::foo::bar + return [list ::$cmd] + } else { + # (foo::bar , ::sub) -> ::sub::foo::bar ::foo::bar + return [list ${namespace}::$cmd ::$cmd] + } +} + +# auto_import -- +# +# Invoked during "namespace import" to make see if the imported commands +# reside in an autoloaded library. If so, the commands are loaded so +# that they will be available for the import links. If not, then this +# procedure does nothing. +# +# Arguments - +# pattern The pattern of commands being imported (like "foo::*") +# a canonical namespace as returned by [namespace current] + +proc auto_import {pattern} { + global auto_index + + # If no namespace is specified, this will be an error case + + if {![string match *::* $pattern]} { + return + } + + set ns [uplevel 1 [list ::namespace current]] + set patternList [auto_qualify $pattern $ns] + + auto_load_index + + foreach pattern $patternList { + foreach name [array names auto_index $pattern] { + if {([namespace which -command $name] eq "") + && ([namespace qualifiers $pattern] eq [namespace qualifiers $name])} { + namespace eval :: $auto_index($name) + } + } + } +} + +# auto_execok -- +# +# Returns string that indicates name of program to execute if +# name corresponds to a shell builtin or an executable in the +# Windows search path, or "" otherwise. Builds an associative +# array auto_execs that caches information about previous checks, +# for speed. +# +# Arguments: +# name - Name of a command. + +if {$tcl_platform(platform) eq "windows"} { +# Windows version. +# +# Note that info executable doesn't work under Windows, so we have to +# look for files with .exe, .com, or .bat extensions. Also, the path +# may be in the Path or PATH environment variables, and path +# components are separated with semicolons, not colons as under Unix. +# +proc auto_execok name { + global auto_execs env tcl_platform + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + + set shellBuiltins [list cls copy date del dir echo erase md mkdir \ + mklink rd ren rename rmdir start time type ver vol] + if {[info exists env(PATHEXT)]} { + # Add an initial ; to have the {} extension check first. + set execExtensions [split ";$env(PATHEXT)" ";"] + } else { + set execExtensions [list {} .com .exe .bat .cmd] + } + + if {[string tolower $name] in $shellBuiltins} { + # When this is command.com for some reason on Win2K, Tcl won't + # exec it unless the case is right, which this corrects. COMSPEC + # may not point to a real file, so do the check. + set cmd $env(COMSPEC) + if {[file exists $cmd]} { + set cmd [file attributes $cmd -shortname] + } + return [set auto_execs($name) [list $cmd /c $name]] + } + + if {[llength [file split $name]] != 1} { + foreach ext $execExtensions { + set file ${name}${ext} + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + return "" + } + + set path "[file dirname [info nameof]];.;" + if {[info exists env(WINDIR)]} { + set windir $env(WINDIR) + } + if {[info exists windir]} { + if {$tcl_platform(os) eq "Windows NT"} { + append path "$windir/system32;" + } + append path "$windir/system;$windir;" + } + + foreach var {PATH Path path} { + if {[info exists env($var)]} { + append path ";$env($var)" + } + } + + foreach ext $execExtensions { + unset -nocomplain checked + foreach dir [split $path {;}] { + # Skip already checked directories + if {[info exists checked($dir)] || ($dir eq "")} { + continue + } + set checked($dir) {} + set file [file join $dir ${name}${ext}] + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + } + return "" +} + +} else { +# Unix version. +# +proc auto_execok name { + global auto_execs env + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + if {[llength [file split $name]] != 1} { + if {[file executable $name] && ![file isdirectory $name]} { + set auto_execs($name) [list $name] + } + return $auto_execs($name) + } + foreach dir [split $env(PATH) :] { + if {$dir eq ""} { + set dir . + } + set file [file join $dir $name] + if {[file executable $file] && ![file isdirectory $file]} { + set auto_execs($name) [list $file] + return $auto_execs($name) + } + } + return "" +} + +} + +# ::tcl::CopyDirectory -- +# +# This procedure is called by Tcl's core when attempts to call the +# filesystem's copydirectory function fail. The semantics of the call +# are that 'dest' does not yet exist, i.e. dest should become the exact +# image of src. If dest does exist, we throw an error. +# +# Note that making changes to this procedure can change the results +# of running Tcl's tests. +# +# Arguments: +# action - "renaming" or "copying" +# src - source directory +# dest - destination directory +proc tcl::CopyDirectory {action src dest} { + set nsrc [file normalize $src] + set ndest [file normalize $dest] + + if {$action eq "renaming"} { + # Can't rename volumes. We could give a more precise + # error message here, but that would break the test suite. + if {$nsrc in [file volumes]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + if {[file exists $dest]} { + if {$nsrc eq $ndest} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + if {$action eq "copying"} { + # We used to throw an error here, but, looking more closely + # at the core copy code in tclFCmd.c, if the destination + # exists, then we should only call this function if -force + # is true, which means we just want to over-write. So, + # the following code is now commented out. + # + # return -code error "error $action \"$src\" to\ + # \"$dest\": file already exists" + } else { + # Depending on the platform, and on the current + # working directory, the directories '.', '..' + # can be returned in various combinations. Anyway, + # if any other file is returned, we must signal an error. + set existing [glob -nocomplain -directory $dest * .*] + lappend existing {*}[glob -nocomplain -directory $dest \ + -type hidden * .*] + foreach s $existing { + if {[file tail $s] ni {. ..}} { + return -code error "error $action \"$src\" to\ + \"$dest\": file already exists" + } + } + } + } else { + if {[string first $nsrc $ndest] != -1} { + set srclen [expr {[llength [file split $nsrc]] - 1}] + set ndest [lindex [file split $ndest] $srclen] + if {$ndest eq [file tail $nsrc]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + file mkdir $dest + } + # Have to be careful to capture both visible and hidden files. + # We will also be more generous to the file system and not + # assume the hidden and non-hidden lists are non-overlapping. + # + # On Unix 'hidden' files begin with '.'. On other platforms + # or filesystems hidden files may have other interpretations. + set filelist [concat [glob -nocomplain -directory $src *] \ + [glob -nocomplain -directory $src -types hidden *]] + + foreach s [lsort -unique $filelist] { + if {[file tail $s] ni {. ..}} { + file copy -force -- $s [file join $dest [file tail $s]] + } + } + return +} diff --git a/flaskwebproject/FlaskWebProject1/Lib/tempfile.py b/flaskwebproject/FlaskWebProject1/Lib/tempfile.py new file mode 100644 index 0000000..2cb5434 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/tempfile.py @@ -0,0 +1,813 @@ +"""Temporary files. + +This module provides generic, low- and high-level interfaces for +creating temporary files and directories. All of the interfaces +provided by this module can be used without fear of race conditions +except for 'mktemp'. 'mktemp' is subject to race conditions and +should not be used; it is provided for backward compatibility only. + +The default path names are returned as str. If you supply bytes as +input, all return values will be in bytes. Ex: + + >>> tempfile.mkstemp() + (4, '/tmp/tmptpu9nin8') + >>> tempfile.mkdtemp(suffix=b'') + b'/tmp/tmppbi8f0hy' + +This module also provides some data items to the user: + + TMP_MAX - maximum number of names that will be tried before + giving up. + tempdir - If this is set to a string before the first use of + any routine from this module, it will be considered as + another candidate location to store temporary files. +""" + +__all__ = [ + "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces + "SpooledTemporaryFile", "TemporaryDirectory", + "mkstemp", "mkdtemp", # low level safe interfaces + "mktemp", # deprecated unsafe interface + "TMP_MAX", "gettempprefix", # constants + "tempdir", "gettempdir", + "gettempprefixb", "gettempdirb", + ] + + +# Imports. + +import functools as _functools +import warnings as _warnings +import io as _io +import os as _os +import shutil as _shutil +import errno as _errno +from random import Random as _Random +import weakref as _weakref + +try: + import _thread +except ImportError: + import _dummy_thread as _thread +_allocate_lock = _thread.allocate_lock + +_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL +if hasattr(_os, 'O_NOFOLLOW'): + _text_openflags |= _os.O_NOFOLLOW + +_bin_openflags = _text_openflags +if hasattr(_os, 'O_BINARY'): + _bin_openflags |= _os.O_BINARY + +if hasattr(_os, 'TMP_MAX'): + TMP_MAX = _os.TMP_MAX +else: + TMP_MAX = 10000 + +# This variable _was_ unused for legacy reasons, see issue 10354. +# But as of 3.5 we actually use it at runtime so changing it would +# have a possibly desirable side effect... But we do not want to support +# that as an API. It is undocumented on purpose. Do not depend on this. +template = "tmp" + +# Internal routines. + +_once_lock = _allocate_lock() + +if hasattr(_os, "lstat"): + _stat = _os.lstat +elif hasattr(_os, "stat"): + _stat = _os.stat +else: + # Fallback. All we need is something that raises OSError if the + # file doesn't exist. + def _stat(fn): + fd = _os.open(fn, _os.O_RDONLY) + _os.close(fd) + +def _exists(fn): + try: + _stat(fn) + except OSError: + return False + else: + return True + + +def _infer_return_type(*args): + """Look at the type of all args and divine their implied return type.""" + return_type = None + for arg in args: + if arg is None: + continue + if isinstance(arg, bytes): + if return_type is str: + raise TypeError("Can't mix bytes and non-bytes in " + "path components.") + return_type = bytes + else: + if return_type is bytes: + raise TypeError("Can't mix bytes and non-bytes in " + "path components.") + return_type = str + if return_type is None: + return str # tempfile APIs return a str by default. + return return_type + + +def _sanitize_params(prefix, suffix, dir): + """Common parameter processing for most APIs in this module.""" + output_type = _infer_return_type(prefix, suffix, dir) + if suffix is None: + suffix = output_type() + if prefix is None: + if output_type is str: + prefix = template + else: + prefix = _os.fsencode(template) + if dir is None: + if output_type is str: + dir = gettempdir() + else: + dir = gettempdirb() + return prefix, suffix, dir, output_type + + +class _RandomNameSequence: + """An instance of _RandomNameSequence generates an endless + sequence of unpredictable strings which can safely be incorporated + into file names. Each string is eight characters long. Multiple + threads can safely use the same instance at the same time. + + _RandomNameSequence is an iterator.""" + + characters = "abcdefghijklmnopqrstuvwxyz0123456789_" + + @property + def rng(self): + cur_pid = _os.getpid() + if cur_pid != getattr(self, '_rng_pid', None): + self._rng = _Random() + self._rng_pid = cur_pid + return self._rng + + def __iter__(self): + return self + + def __next__(self): + c = self.characters + choose = self.rng.choice + letters = [choose(c) for dummy in range(8)] + return ''.join(letters) + +def _candidate_tempdir_list(): + """Generate a list of candidate temporary directories which + _get_default_tempdir will try.""" + + dirlist = [] + + # First, try the environment. + for envname in 'TMPDIR', 'TEMP', 'TMP': + dirname = _os.getenv(envname) + if dirname: dirlist.append(dirname) + + # Failing that, try OS-specific locations. + if _os.name == 'nt': + dirlist.extend([ _os.path.expanduser(r'~\AppData\Local\Temp'), + _os.path.expandvars(r'%SYSTEMROOT%\Temp'), + r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) + else: + dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) + + # As a last resort, the current directory. + try: + dirlist.append(_os.getcwd()) + except (AttributeError, OSError): + dirlist.append(_os.curdir) + + return dirlist + +def _get_default_tempdir(): + """Calculate the default directory to use for temporary files. + This routine should be called exactly once. + + We determine whether or not a candidate temp dir is usable by + trying to create and write to a file in that directory. If this + is successful, the test file is deleted. To prevent denial of + service, the name of the test file must be randomized.""" + + namer = _RandomNameSequence() + dirlist = _candidate_tempdir_list() + + for dir in dirlist: + if dir != _os.curdir: + dir = _os.path.abspath(dir) + # Try only a few names per directory. + for seq in range(100): + name = next(namer) + filename = _os.path.join(dir, name) + try: + fd = _os.open(filename, _bin_openflags, 0o600) + try: + try: + with _io.open(fd, 'wb', closefd=False) as fp: + fp.write(b'blat') + finally: + _os.close(fd) + finally: + _os.unlink(filename) + return dir + except FileExistsError: + pass + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + break # no point trying more names in this directory + except OSError: + break # no point trying more names in this directory + raise FileNotFoundError(_errno.ENOENT, + "No usable temporary directory found in %s" % + dirlist) + +_name_sequence = None + +def _get_candidate_names(): + """Common setup sequence for all user-callable interfaces.""" + + global _name_sequence + if _name_sequence is None: + _once_lock.acquire() + try: + if _name_sequence is None: + _name_sequence = _RandomNameSequence() + finally: + _once_lock.release() + return _name_sequence + + +def _mkstemp_inner(dir, pre, suf, flags, output_type): + """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" + + names = _get_candidate_names() + if output_type is bytes: + names = map(_os.fsencode, names) + + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, pre + name + suf) + try: + fd = _os.open(file, flags, 0o600) + except FileExistsError: + continue # try again + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + else: + raise + return (fd, _os.path.abspath(file)) + + raise FileExistsError(_errno.EEXIST, + "No usable temporary file name found") + + +# User visible interfaces. + +def gettempprefix(): + """The default prefix for temporary directories.""" + return template + +def gettempprefixb(): + """The default prefix for temporary directories as bytes.""" + return _os.fsencode(gettempprefix()) + +tempdir = None + +def gettempdir(): + """Accessor for tempfile.tempdir.""" + global tempdir + if tempdir is None: + _once_lock.acquire() + try: + if tempdir is None: + tempdir = _get_default_tempdir() + finally: + _once_lock.release() + return tempdir + +def gettempdirb(): + """A bytes version of tempfile.gettempdir().""" + return _os.fsencode(gettempdir()) + +def mkstemp(suffix=None, prefix=None, dir=None, text=False): + """User-callable function to create and return a unique temporary + file. The return value is a pair (fd, name) where fd is the + file descriptor returned by os.open, and name is the filename. + + If 'suffix' is not None, the file name will end with that suffix, + otherwise there will be no suffix. + + If 'prefix' is not None, the file name will begin with that prefix, + otherwise a default prefix is used. + + If 'dir' is not None, the file will be created in that directory, + otherwise a default directory is used. + + If 'text' is specified and true, the file is opened in text + mode. Else (the default) the file is opened in binary mode. On + some operating systems, this makes no difference. + + If any of 'suffix', 'prefix' and 'dir' are not None, they must be the + same type. If they are bytes, the returned name will be bytes; str + otherwise. + + The file is readable and writable only by the creating user ID. + If the operating system uses permission bits to indicate whether a + file is executable, the file is executable by no one. The file + descriptor is not inherited by children of this process. + + Caller is responsible for deleting the file when done with it. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + if text: + flags = _text_openflags + else: + flags = _bin_openflags + + return _mkstemp_inner(dir, prefix, suffix, flags, output_type) + + +def mkdtemp(suffix=None, prefix=None, dir=None): + """User-callable function to create and return a unique temporary + directory. The return value is the pathname of the directory. + + Arguments are as for mkstemp, except that the 'text' argument is + not accepted. + + The directory is readable, writable, and searchable only by the + creating user. + + Caller is responsible for deleting the directory when done with it. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + names = _get_candidate_names() + if output_type is bytes: + names = map(_os.fsencode, names) + + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, prefix + name + suffix) + try: + _os.mkdir(file, 0o700) + except FileExistsError: + continue # try again + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + else: + raise + return file + + raise FileExistsError(_errno.EEXIST, + "No usable temporary directory name found") + +def mktemp(suffix="", prefix=template, dir=None): + """User-callable function to return a unique temporary file name. The + file is not created. + + Arguments are similar to mkstemp, except that the 'text' argument is + not accepted, and suffix=None, prefix=None and bytes file names are not + supported. + + THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may + refer to a file that did not exist at some point, but by the time + you get around to creating it, someone else may have beaten you to + the punch. + """ + +## from warnings import warn as _warn +## _warn("mktemp is a potential security risk to your program", +## RuntimeWarning, stacklevel=2) + + if dir is None: + dir = gettempdir() + + names = _get_candidate_names() + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, prefix + name + suffix) + if not _exists(file): + return file + + raise FileExistsError(_errno.EEXIST, + "No usable temporary filename found") + + +class _TemporaryFileCloser: + """A separate object allowing proper closing of a temporary file's + underlying file object, without adding a __del__ method to the + temporary file.""" + + file = None # Set here since __del__ checks it + close_called = False + + def __init__(self, file, name, delete=True): + self.file = file + self.name = name + self.delete = delete + + # NT provides delete-on-close as a primitive, so we don't need + # the wrapper to do anything special. We still use it so that + # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. + if _os.name != 'nt': + # Cache the unlinker so we don't get spurious errors at + # shutdown when the module-level "os" is None'd out. Note + # that this must be referenced as self.unlink, because the + # name TemporaryFileWrapper may also get None'd out before + # __del__ is called. + + def close(self, unlink=_os.unlink): + if not self.close_called and self.file is not None: + self.close_called = True + try: + self.file.close() + finally: + if self.delete: + unlink(self.name) + + # Need to ensure the file is deleted on __del__ + def __del__(self): + self.close() + + else: + def close(self): + if not self.close_called: + self.close_called = True + self.file.close() + + +class _TemporaryFileWrapper: + """Temporary file wrapper + + This class provides a wrapper around files opened for + temporary use. In particular, it seeks to automatically + remove the file when it is no longer needed. + """ + + def __init__(self, file, name, delete=True): + self.file = file + self.name = name + self.delete = delete + self._closer = _TemporaryFileCloser(file, name, delete) + + def __getattr__(self, name): + # Attribute lookups are delegated to the underlying file + # and cached for non-numeric results + # (i.e. methods are cached, closed and friends are not) + file = self.__dict__['file'] + a = getattr(file, name) + if hasattr(a, '__call__'): + func = a + @_functools.wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + # Avoid closing the file as long as the wrapper is alive, + # see issue #18879. + func_wrapper._closer = self._closer + a = func_wrapper + if not isinstance(a, int): + setattr(self, name, a) + return a + + # The underlying __enter__ method returns the wrong object + # (self.file) so override it to return the wrapper + def __enter__(self): + self.file.__enter__() + return self + + # Need to trap __exit__ as well to ensure the file gets + # deleted when used in a with statement + def __exit__(self, exc, value, tb): + result = self.file.__exit__(exc, value, tb) + self.close() + return result + + def close(self): + """ + Close the temporary file, possibly deleting it. + """ + self._closer.close() + + # iter() doesn't use __getattr__ to find the __iter__ method + def __iter__(self): + # Don't return iter(self.file), but yield from it to avoid closing + # file as long as it's being used as iterator (see issue #23700). We + # can't use 'yield from' here because iter(file) returns the file + # object itself, which has a close method, and thus the file would get + # closed when the generator is finalized, due to PEP380 semantics. + for line in self.file: + yield line + + +def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, + newline=None, suffix=None, prefix=None, + dir=None, delete=True): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to io.open (default "w+b"). + 'buffering' -- the buffer size argument to io.open (default -1). + 'encoding' -- the encoding argument to io.open (default None) + 'newline' -- the newline argument to io.open (default None) + 'delete' -- whether the file is deleted on close (default True). + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface; the name of the file + is accessible as its 'name' attribute. The file will be automatically + deleted when it is closed unless the 'delete' argument is set to False. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + flags = _bin_openflags + + # Setting O_TEMPORARY in the flags causes the OS to delete + # the file when it is closed. This is only supported by Windows. + if _os.name == 'nt' and delete: + flags |= _os.O_TEMPORARY + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type) + try: + file = _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + + return _TemporaryFileWrapper(file, name, delete) + except BaseException: + _os.unlink(name) + _os.close(fd) + raise + +if _os.name != 'posix' or _os.sys.platform == 'cygwin': + # On non-POSIX and Cygwin systems, assume that we cannot unlink a file + # while it is open. + TemporaryFile = NamedTemporaryFile + +else: + # Is the O_TMPFILE flag available and does it work? + # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an + # IsADirectoryError exception + _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE') + + def TemporaryFile(mode='w+b', buffering=-1, encoding=None, + newline=None, suffix=None, prefix=None, + dir=None): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to io.open (default "w+b"). + 'buffering' -- the buffer size argument to io.open (default -1). + 'encoding' -- the encoding argument to io.open (default None) + 'newline' -- the newline argument to io.open (default None) + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface. The file has no + name, and will cease to exist when it is closed. + """ + global _O_TMPFILE_WORKS + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + flags = _bin_openflags + if _O_TMPFILE_WORKS: + try: + flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT + fd = _os.open(dir, flags2, 0o600) + except IsADirectoryError: + # Linux kernel older than 3.11 ignores the O_TMPFILE flag: + # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory + # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a + # directory cannot be open to write. Set flag to False to not + # try again. + _O_TMPFILE_WORKS = False + except OSError: + # The filesystem of the directory does not support O_TMPFILE. + # For example, OSError(95, 'Operation not supported'). + # + # On Linux kernel older than 3.11, trying to open a regular + # file (or a symbolic link to a regular file) with O_TMPFILE + # fails with NotADirectoryError, because O_TMPFILE is read as + # O_DIRECTORY. + pass + else: + try: + return _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + except: + _os.close(fd) + raise + # Fallback to _mkstemp_inner(). + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type) + try: + _os.unlink(name) + return _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + except: + _os.close(fd) + raise + +class SpooledTemporaryFile: + """Temporary file wrapper, specialized to switch from BytesIO + or StringIO to a real file when it exceeds a certain size or + when a fileno is needed. + """ + _rolled = False + + def __init__(self, max_size=0, mode='w+b', buffering=-1, + encoding=None, newline=None, + suffix=None, prefix=None, dir=None): + if 'b' in mode: + self._file = _io.BytesIO() + else: + # Setting newline="\n" avoids newline translation; + # this is important because otherwise on Windows we'd + # get double newline translation upon rollover(). + self._file = _io.StringIO(newline="\n") + self._max_size = max_size + self._rolled = False + self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering, + 'suffix': suffix, 'prefix': prefix, + 'encoding': encoding, 'newline': newline, + 'dir': dir} + + def _check(self, file): + if self._rolled: return + max_size = self._max_size + if max_size and file.tell() > max_size: + self.rollover() + + def rollover(self): + if self._rolled: return + file = self._file + newfile = self._file = TemporaryFile(**self._TemporaryFileArgs) + del self._TemporaryFileArgs + + newfile.write(file.getvalue()) + newfile.seek(file.tell(), 0) + + self._rolled = True + + # The method caching trick from NamedTemporaryFile + # won't work here, because _file may change from a + # BytesIO/StringIO instance to a real file. So we list + # all the methods directly. + + # Context management protocol + def __enter__(self): + if self._file.closed: + raise ValueError("Cannot enter context with closed file") + return self + + def __exit__(self, exc, value, tb): + self._file.close() + + # file protocol + def __iter__(self): + return self._file.__iter__() + + def close(self): + self._file.close() + + @property + def closed(self): + return self._file.closed + + @property + def encoding(self): + try: + return self._file.encoding + except AttributeError: + if 'b' in self._TemporaryFileArgs['mode']: + raise + return self._TemporaryFileArgs['encoding'] + + def fileno(self): + self.rollover() + return self._file.fileno() + + def flush(self): + self._file.flush() + + def isatty(self): + return self._file.isatty() + + @property + def mode(self): + try: + return self._file.mode + except AttributeError: + return self._TemporaryFileArgs['mode'] + + @property + def name(self): + try: + return self._file.name + except AttributeError: + return None + + @property + def newlines(self): + try: + return self._file.newlines + except AttributeError: + if 'b' in self._TemporaryFileArgs['mode']: + raise + return self._TemporaryFileArgs['newline'] + + def read(self, *args): + return self._file.read(*args) + + def readline(self, *args): + return self._file.readline(*args) + + def readlines(self, *args): + return self._file.readlines(*args) + + def seek(self, *args): + self._file.seek(*args) + + @property + def softspace(self): + return self._file.softspace + + def tell(self): + return self._file.tell() + + def truncate(self, size=None): + if size is None: + self._file.truncate() + else: + if size > self._max_size: + self.rollover() + self._file.truncate(size) + + def write(self, s): + file = self._file + rv = file.write(s) + self._check(file) + return rv + + def writelines(self, iterable): + file = self._file + rv = file.writelines(iterable) + self._check(file) + return rv + + +class TemporaryDirectory(object): + """Create and return a temporary directory. This has the same + behavior as mkdtemp but can be used as a context manager. For + example: + + with TemporaryDirectory() as tmpdir: + ... + + Upon exiting the context, the directory and everything contained + in it are removed. + """ + + def __init__(self, suffix=None, prefix=None, dir=None): + self.name = mkdtemp(suffix, prefix, dir) + self._finalizer = _weakref.finalize( + self, self._cleanup, self.name, + warn_message="Implicitly cleaning up {!r}".format(self)) + + @classmethod + def _cleanup(cls, name, warn_message): + _shutil.rmtree(name) + _warnings.warn(warn_message, ResourceWarning) + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.name) + + def __enter__(self): + return self.name + + def __exit__(self, exc, value, tb): + self.cleanup() + + def cleanup(self): + if self._finalizer.detach(): + _shutil.rmtree(self.name) diff --git a/flaskwebproject/FlaskWebProject1/Lib/token.py b/flaskwebproject/FlaskWebProject1/Lib/token.py new file mode 100644 index 0000000..5fdb222 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/token.py @@ -0,0 +1,143 @@ +"""Token constants (from "token.h").""" + +__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF'] + +# This file is automatically generated; please don't muck it up! +# +# To update the symbols in this file, 'cd' to the top directory of +# the python source tree after building the interpreter and run: +# +# ./python Lib/token.py + +#--start constants-- +ENDMARKER = 0 +NAME = 1 +NUMBER = 2 +STRING = 3 +NEWLINE = 4 +INDENT = 5 +DEDENT = 6 +LPAR = 7 +RPAR = 8 +LSQB = 9 +RSQB = 10 +COLON = 11 +COMMA = 12 +SEMI = 13 +PLUS = 14 +MINUS = 15 +STAR = 16 +SLASH = 17 +VBAR = 18 +AMPER = 19 +LESS = 20 +GREATER = 21 +EQUAL = 22 +DOT = 23 +PERCENT = 24 +LBRACE = 25 +RBRACE = 26 +EQEQUAL = 27 +NOTEQUAL = 28 +LESSEQUAL = 29 +GREATEREQUAL = 30 +TILDE = 31 +CIRCUMFLEX = 32 +LEFTSHIFT = 33 +RIGHTSHIFT = 34 +DOUBLESTAR = 35 +PLUSEQUAL = 36 +MINEQUAL = 37 +STAREQUAL = 38 +SLASHEQUAL = 39 +PERCENTEQUAL = 40 +AMPEREQUAL = 41 +VBAREQUAL = 42 +CIRCUMFLEXEQUAL = 43 +LEFTSHIFTEQUAL = 44 +RIGHTSHIFTEQUAL = 45 +DOUBLESTAREQUAL = 46 +DOUBLESLASH = 47 +DOUBLESLASHEQUAL = 48 +AT = 49 +ATEQUAL = 50 +RARROW = 51 +ELLIPSIS = 52 +OP = 53 +AWAIT = 54 +ASYNC = 55 +ERRORTOKEN = 56 +N_TOKENS = 57 +NT_OFFSET = 256 +#--end constants-- + +tok_name = {value: name + for name, value in globals().items() + if isinstance(value, int) and not name.startswith('_')} +__all__.extend(tok_name.values()) + +def ISTERMINAL(x): + return x < NT_OFFSET + +def ISNONTERMINAL(x): + return x >= NT_OFFSET + +def ISEOF(x): + return x == ENDMARKER + + +def _main(): + import re + import sys + args = sys.argv[1:] + inFileName = args and args[0] or "Include/token.h" + outFileName = "Lib/token.py" + if len(args) > 1: + outFileName = args[1] + try: + fp = open(inFileName) + except OSError as err: + sys.stdout.write("I/O error: %s\n" % str(err)) + sys.exit(1) + with fp: + lines = fp.read().split("\n") + prog = re.compile( + "#define[ \t][ \t]*([A-Z0-9][A-Z0-9_]*)[ \t][ \t]*([0-9][0-9]*)", + re.IGNORECASE) + tokens = {} + for line in lines: + match = prog.match(line) + if match: + name, val = match.group(1, 2) + val = int(val) + tokens[val] = name # reverse so we can sort them... + keys = sorted(tokens.keys()) + # load the output skeleton from the target: + try: + fp = open(outFileName) + except OSError as err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(2) + with fp: + format = fp.read().split("\n") + try: + start = format.index("#--start constants--") + 1 + end = format.index("#--end constants--") + except ValueError: + sys.stderr.write("target does not contain format markers") + sys.exit(3) + lines = [] + for val in keys: + lines.append("%s = %d" % (tokens[val], val)) + format[start:end] = lines + try: + fp = open(outFileName, 'w') + except OSError as err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(4) + with fp: + fp.write("\n".join(format)) + + +if __name__ == "__main__": + _main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/tokenize.py b/flaskwebproject/FlaskWebProject1/Lib/tokenize.py new file mode 100644 index 0000000..825aa90 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/tokenize.py @@ -0,0 +1,793 @@ +"""Tokenization help for Python programs. + +tokenize(readline) is a generator that breaks a stream of bytes into +Python tokens. It decodes the bytes according to PEP-0263 for +determining source file encoding. + +It accepts a readline-like method which is called repeatedly to get the +next line of input (or b"" for EOF). It generates 5-tuples with these +members: + + the token type (see token.py) + the token (a string) + the starting (row, column) indices of the token (a 2-tuple of ints) + the ending (row, column) indices of the token (a 2-tuple of ints) + the original line (string) + +It is designed to match the working of the Python tokenizer exactly, except +that it produces COMMENT tokens for comments and gives type OP for all +operators. Additionally, all token lists start with an ENCODING token +which tells you which encoding was used to decode the bytes stream. +""" + +__author__ = 'Ka-Ping Yee ' +__credits__ = ('GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, ' + 'Skip Montanaro, Raymond Hettinger, Trent Nelson, ' + 'Michael Foord') +from builtins import open as _builtin_open +from codecs import lookup, BOM_UTF8 +import collections +from io import TextIOWrapper +from itertools import chain +import itertools as _itertools +import re +import sys +from token import * + +cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) +blank_re = re.compile(br'^[ \t\f]*(?:[#\r\n]|$)', re.ASCII) + +import token +__all__ = token.__all__ + ["COMMENT", "tokenize", "detect_encoding", + "NL", "untokenize", "ENCODING", "TokenInfo"] +del token + +COMMENT = N_TOKENS +tok_name[COMMENT] = 'COMMENT' +NL = N_TOKENS + 1 +tok_name[NL] = 'NL' +ENCODING = N_TOKENS + 2 +tok_name[ENCODING] = 'ENCODING' +N_TOKENS += 3 +EXACT_TOKEN_TYPES = { + '(': LPAR, + ')': RPAR, + '[': LSQB, + ']': RSQB, + ':': COLON, + ',': COMMA, + ';': SEMI, + '+': PLUS, + '-': MINUS, + '*': STAR, + '/': SLASH, + '|': VBAR, + '&': AMPER, + '<': LESS, + '>': GREATER, + '=': EQUAL, + '.': DOT, + '%': PERCENT, + '{': LBRACE, + '}': RBRACE, + '==': EQEQUAL, + '!=': NOTEQUAL, + '<=': LESSEQUAL, + '>=': GREATEREQUAL, + '~': TILDE, + '^': CIRCUMFLEX, + '<<': LEFTSHIFT, + '>>': RIGHTSHIFT, + '**': DOUBLESTAR, + '+=': PLUSEQUAL, + '-=': MINEQUAL, + '*=': STAREQUAL, + '/=': SLASHEQUAL, + '%=': PERCENTEQUAL, + '&=': AMPEREQUAL, + '|=': VBAREQUAL, + '^=': CIRCUMFLEXEQUAL, + '<<=': LEFTSHIFTEQUAL, + '>>=': RIGHTSHIFTEQUAL, + '**=': DOUBLESTAREQUAL, + '//': DOUBLESLASH, + '//=': DOUBLESLASHEQUAL, + '@': AT, + '@=': ATEQUAL, +} + +class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')): + def __repr__(self): + annotated_type = '%d (%s)' % (self.type, tok_name[self.type]) + return ('TokenInfo(type=%s, string=%r, start=%r, end=%r, line=%r)' % + self._replace(type=annotated_type)) + + @property + def exact_type(self): + if self.type == OP and self.string in EXACT_TOKEN_TYPES: + return EXACT_TOKEN_TYPES[self.string] + else: + return self.type + +def group(*choices): return '(' + '|'.join(choices) + ')' +def any(*choices): return group(*choices) + '*' +def maybe(*choices): return group(*choices) + '?' + +# Note: we use unicode matching for names ("\w") but ascii matching for +# number literals. +Whitespace = r'[ \f\t]*' +Comment = r'#[^\r\n]*' +Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) +Name = r'\w+' + +Hexnumber = r'0[xX](?:_?[0-9a-fA-F])+' +Binnumber = r'0[bB](?:_?[01])+' +Octnumber = r'0[oO](?:_?[0-7])+' +Decnumber = r'(?:0(?:_?0)*|[1-9](?:_?[0-9])*)' +Intnumber = group(Hexnumber, Binnumber, Octnumber, Decnumber) +Exponent = r'[eE][-+]?[0-9](?:_?[0-9])*' +Pointfloat = group(r'[0-9](?:_?[0-9])*\.(?:[0-9](?:_?[0-9])*)?', + r'\.[0-9](?:_?[0-9])*') + maybe(Exponent) +Expfloat = r'[0-9](?:_?[0-9])*' + Exponent +Floatnumber = group(Pointfloat, Expfloat) +Imagnumber = group(r'[0-9](?:_?[0-9])*[jJ]', Floatnumber + r'[jJ]') +Number = group(Imagnumber, Floatnumber, Intnumber) + +# Return the empty string, plus all of the valid string prefixes. +def _all_string_prefixes(): + # The valid string prefixes. Only contain the lower case versions, + # and don't contain any permuations (include 'fr', but not + # 'rf'). The various permutations will be generated. + _valid_string_prefixes = ['b', 'r', 'u', 'f', 'br', 'fr'] + # if we add binary f-strings, add: ['fb', 'fbr'] + result = set(['']) + for prefix in _valid_string_prefixes: + for t in _itertools.permutations(prefix): + # create a list with upper and lower versions of each + # character + for u in _itertools.product(*[(c, c.upper()) for c in t]): + result.add(''.join(u)) + return result + +def _compile(expr): + return re.compile(expr, re.UNICODE) + +# Note that since _all_string_prefixes includes the empty string, +# StringPrefix can be the empty string (making it optional). +StringPrefix = group(*_all_string_prefixes()) + +# Tail end of ' string. +Single = r"[^'\\]*(?:\\.[^'\\]*)*'" +# Tail end of " string. +Double = r'[^"\\]*(?:\\.[^"\\]*)*"' +# Tail end of ''' string. +Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" +# Tail end of """ string. +Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' +Triple = group(StringPrefix + "'''", StringPrefix + '"""') +# Single-line ' or " string. +String = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", + StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*"') + +# Because of leftmost-then-longest match semantics, be sure to put the +# longest operators first (e.g., if = came before ==, == would get +# recognized as two instances of =). +Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"!=", + r"//=?", r"->", + r"[+\-*/%&@|^=<>]=?", + r"~") + +Bracket = '[][(){}]' +Special = group(r'\r?\n', r'\.\.\.', r'[:;.,@]') +Funny = group(Operator, Bracket, Special) + +PlainToken = group(Number, Funny, String, Name) +Token = Ignore + PlainToken + +# First (or only) line of ' or " string. +ContStr = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" + + group("'", r'\\\r?\n'), + StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' + + group('"', r'\\\r?\n')) +PseudoExtras = group(r'\\\r?\n|\Z', Comment, Triple) +PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) + +# For a given string prefix plus quotes, endpats maps it to a regex +# to match the remainder of that string. _prefix can be empty, for +# a normal single or triple quoted string (with no prefix). +endpats = {} +for _prefix in _all_string_prefixes(): + endpats[_prefix + "'"] = Single + endpats[_prefix + '"'] = Double + endpats[_prefix + "'''"] = Single3 + endpats[_prefix + '"""'] = Double3 + +# A set of all of the single and triple quoted string prefixes, +# including the opening quotes. +single_quoted = set() +triple_quoted = set() +for t in _all_string_prefixes(): + for u in (t + '"', t + "'"): + single_quoted.add(u) + for u in (t + '"""', t + "'''"): + triple_quoted.add(u) + +tabsize = 8 + +class TokenError(Exception): pass + +class StopTokenizing(Exception): pass + + +class Untokenizer: + + def __init__(self): + self.tokens = [] + self.prev_row = 1 + self.prev_col = 0 + self.encoding = None + + def add_whitespace(self, start): + row, col = start + if row < self.prev_row or row == self.prev_row and col < self.prev_col: + raise ValueError("start ({},{}) precedes previous end ({},{})" + .format(row, col, self.prev_row, self.prev_col)) + row_offset = row - self.prev_row + if row_offset: + self.tokens.append("\\\n" * row_offset) + self.prev_col = 0 + col_offset = col - self.prev_col + if col_offset: + self.tokens.append(" " * col_offset) + + def untokenize(self, iterable): + it = iter(iterable) + indents = [] + startline = False + for t in it: + if len(t) == 2: + self.compat(t, it) + break + tok_type, token, start, end, line = t + if tok_type == ENCODING: + self.encoding = token + continue + if tok_type == ENDMARKER: + break + if tok_type == INDENT: + indents.append(token) + continue + elif tok_type == DEDENT: + indents.pop() + self.prev_row, self.prev_col = end + continue + elif tok_type in (NEWLINE, NL): + startline = True + elif startline and indents: + indent = indents[-1] + if start[1] >= len(indent): + self.tokens.append(indent) + self.prev_col = len(indent) + startline = False + self.add_whitespace(start) + self.tokens.append(token) + self.prev_row, self.prev_col = end + if tok_type in (NEWLINE, NL): + self.prev_row += 1 + self.prev_col = 0 + return "".join(self.tokens) + + def compat(self, token, iterable): + indents = [] + toks_append = self.tokens.append + startline = token[0] in (NEWLINE, NL) + prevstring = False + + for tok in chain([token], iterable): + toknum, tokval = tok[:2] + if toknum == ENCODING: + self.encoding = tokval + continue + + if toknum in (NAME, NUMBER, ASYNC, AWAIT): + tokval += ' ' + + # Insert a space between two consecutive strings + if toknum == STRING: + if prevstring: + tokval = ' ' + tokval + prevstring = True + else: + prevstring = False + + if toknum == INDENT: + indents.append(tokval) + continue + elif toknum == DEDENT: + indents.pop() + continue + elif toknum in (NEWLINE, NL): + startline = True + elif startline and indents: + toks_append(indents[-1]) + startline = False + toks_append(tokval) + + +def untokenize(iterable): + """Transform tokens back into Python source code. + It returns a bytes object, encoded using the ENCODING + token, which is the first token sequence output by tokenize. + + Each element returned by the iterable must be a token sequence + with at least two elements, a token number and token value. If + only two tokens are passed, the resulting output is poor. + + Round-trip invariant for full input: + Untokenized source will match input source exactly + + Round-trip invariant for limited input: + # Output bytes will tokenize back to the input + t1 = [tok[:2] for tok in tokenize(f.readline)] + newcode = untokenize(t1) + readline = BytesIO(newcode).readline + t2 = [tok[:2] for tok in tokenize(readline)] + assert t1 == t2 + """ + ut = Untokenizer() + out = ut.untokenize(iterable) + if ut.encoding is not None: + out = out.encode(ut.encoding) + return out + + +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) + + match = cookie_re.match(line_string) + if not match: + return None + encoding = _get_normal_name(match.group(1)) + 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 encoding != '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] + if not blank_re.match(first): + return default, [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] + + +def open(filename): + """Open a file in read only mode using the encoding detected by + detect_encoding(). + """ + buffer = _builtin_open(filename, 'rb') + try: + encoding, lines = detect_encoding(buffer.readline) + buffer.seek(0) + text = TextIOWrapper(buffer, encoding, line_buffering=True) + text.mode = 'r' + return text + except: + buffer.close() + raise + + +def tokenize(readline): + """ + The tokenize() generator requires one argument, readline, which + must be a callable object which provides the same interface as the + readline() method of built-in file objects. Each call to the function + should return one line of input as bytes. Alternatively, readline + can be a callable function terminating with StopIteration: + readline = open(myfile, 'rb').__next__ # Example of alternate readline + + The generator produces 5-tuples with these members: the token type; the + token string; a 2-tuple (srow, scol) of ints specifying the row and + column where the token begins in the source; a 2-tuple (erow, ecol) of + ints specifying the row and column where the token ends in the source; + and the line on which the token was found. The line passed is the + logical line; continuation lines are included. + + The first token sequence will always be an ENCODING token + which tells you which encoding was used to decode the bytes stream. + """ + # This import is here to avoid problems when the itertools module is not + # built yet and tokenize is imported. + from itertools import chain, repeat + encoding, consumed = detect_encoding(readline) + rl_gen = iter(readline, b"") + empty = repeat(b"") + return _tokenize(chain(consumed, rl_gen, empty).__next__, encoding) + + +def _tokenize(readline, encoding): + lnum = parenlev = continued = 0 + numchars = '0123456789' + contstr, needcont = '', 0 + contline = None + indents = [0] + + # 'stashed' and 'async_*' are used for async/await parsing + stashed = None + async_def = False + async_def_indent = 0 + async_def_nl = False + + if encoding is not None: + if encoding == "utf-8-sig": + # BOM will already have been stripped. + encoding = "utf-8" + yield TokenInfo(ENCODING, encoding, (0, 0), (0, 0), '') + while True: # loop over lines in stream + try: + line = readline() + except StopIteration: + line = b'' + + if encoding is not None: + line = line.decode(encoding) + lnum += 1 + pos, max = 0, len(line) + + if contstr: # continued string + if not line: + raise TokenError("EOF in multi-line string", strstart) + endmatch = endprog.match(line) + if endmatch: + pos = end = endmatch.end(0) + yield TokenInfo(STRING, contstr + line[:end], + strstart, (lnum, end), contline + line) + contstr, needcont = '', 0 + contline = None + elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': + yield TokenInfo(ERRORTOKEN, contstr + line, + strstart, (lnum, len(line)), contline) + contstr = '' + contline = None + continue + else: + contstr = contstr + line + contline = contline + line + continue + + elif parenlev == 0 and not continued: # new statement + if not line: break + column = 0 + while pos < max: # measure leading whitespace + if line[pos] == ' ': + column += 1 + elif line[pos] == '\t': + column = (column//tabsize + 1)*tabsize + elif line[pos] == '\f': + column = 0 + else: + break + pos += 1 + if pos == max: + break + + if line[pos] in '#\r\n': # skip comments or blank lines + if line[pos] == '#': + comment_token = line[pos:].rstrip('\r\n') + nl_pos = pos + len(comment_token) + yield TokenInfo(COMMENT, comment_token, + (lnum, pos), (lnum, pos + len(comment_token)), line) + yield TokenInfo(NL, line[nl_pos:], + (lnum, nl_pos), (lnum, len(line)), line) + else: + yield TokenInfo((NL, COMMENT)[line[pos] == '#'], line[pos:], + (lnum, pos), (lnum, len(line)), line) + continue + + if column > indents[-1]: # count indents or dedents + indents.append(column) + yield TokenInfo(INDENT, line[:pos], (lnum, 0), (lnum, pos), line) + while column < indents[-1]: + if column not in indents: + raise IndentationError( + "unindent does not match any outer indentation level", + ("", lnum, pos, line)) + indents = indents[:-1] + + if async_def and async_def_indent >= indents[-1]: + async_def = False + async_def_nl = False + async_def_indent = 0 + + yield TokenInfo(DEDENT, '', (lnum, pos), (lnum, pos), line) + + if async_def and async_def_nl and async_def_indent >= indents[-1]: + async_def = False + async_def_nl = False + async_def_indent = 0 + + else: # continued statement + if not line: + raise TokenError("EOF in multi-line statement", (lnum, 0)) + continued = 0 + + while pos < max: + pseudomatch = _compile(PseudoToken).match(line, pos) + if pseudomatch: # scan for tokens + start, end = pseudomatch.span(1) + spos, epos, pos = (lnum, start), (lnum, end), end + if start == end: + continue + token, initial = line[start:end], line[start] + + if (initial in numchars or # ordinary number + (initial == '.' and token != '.' and token != '...')): + yield TokenInfo(NUMBER, token, spos, epos, line) + elif initial in '\r\n': + if stashed: + yield stashed + stashed = None + if parenlev > 0: + yield TokenInfo(NL, token, spos, epos, line) + else: + yield TokenInfo(NEWLINE, token, spos, epos, line) + if async_def: + async_def_nl = True + + elif initial == '#': + assert not token.endswith("\n") + if stashed: + yield stashed + stashed = None + yield TokenInfo(COMMENT, token, spos, epos, line) + + elif token in triple_quoted: + endprog = _compile(endpats[token]) + endmatch = endprog.match(line, pos) + if endmatch: # all on one line + pos = endmatch.end(0) + token = line[start:pos] + yield TokenInfo(STRING, token, spos, (lnum, pos), line) + else: + strstart = (lnum, start) # multiple lines + contstr = line[start:] + contline = line + break + + # Check up to the first 3 chars of the token to see if + # they're in the single_quoted set. If so, they start + # a string. + # We're using the first 3, because we're looking for + # "rb'" (for example) at the start of the token. If + # we switch to longer prefixes, this needs to be + # adjusted. + # Note that initial == token[:1]. + # Also note that single quote checking must come after + # triple quote checking (above). + elif (initial in single_quoted or + token[:2] in single_quoted or + token[:3] in single_quoted): + if token[-1] == '\n': # continued string + strstart = (lnum, start) + # Again, using the first 3 chars of the + # token. This is looking for the matching end + # regex for the correct type of quote + # character. So it's really looking for + # endpats["'"] or endpats['"'], by trying to + # skip string prefix characters, if any. + endprog = _compile(endpats.get(initial) or + endpats.get(token[1]) or + endpats.get(token[2])) + contstr, needcont = line[start:], 1 + contline = line + break + else: # ordinary string + yield TokenInfo(STRING, token, spos, epos, line) + + elif initial.isidentifier(): # ordinary name + if token in ('async', 'await'): + if async_def: + yield TokenInfo( + ASYNC if token == 'async' else AWAIT, + token, spos, epos, line) + continue + + tok = TokenInfo(NAME, token, spos, epos, line) + if token == 'async' and not stashed: + stashed = tok + continue + + if token == 'def': + if (stashed + and stashed.type == NAME + and stashed.string == 'async'): + + async_def = True + async_def_indent = indents[-1] + + yield TokenInfo(ASYNC, stashed.string, + stashed.start, stashed.end, + stashed.line) + stashed = None + + if stashed: + yield stashed + stashed = None + + yield tok + elif initial == '\\': # continued stmt + continued = 1 + else: + if initial in '([{': + parenlev += 1 + elif initial in ')]}': + parenlev -= 1 + if stashed: + yield stashed + stashed = None + yield TokenInfo(OP, token, spos, epos, line) + else: + yield TokenInfo(ERRORTOKEN, line[pos], + (lnum, pos), (lnum, pos+1), line) + pos += 1 + + if stashed: + yield stashed + stashed = None + + for indent in indents[1:]: # pop remaining indent levels + yield TokenInfo(DEDENT, '', (lnum, 0), (lnum, 0), '') + yield TokenInfo(ENDMARKER, '', (lnum, 0), (lnum, 0), '') + + +# An undocumented, backwards compatible, API for all the places in the standard +# library that expect to be able to use tokenize with strings +def generate_tokens(readline): + return _tokenize(readline, None) + +def main(): + import argparse + + # Helper error handling routines + def perror(message): + print(message, file=sys.stderr) + + def error(message, filename=None, location=None): + if location: + args = (filename,) + location + (message,) + perror("%s:%d:%d: error: %s" % args) + elif filename: + perror("%s: error: %s" % (filename, message)) + else: + perror("error: %s" % message) + sys.exit(1) + + # Parse the arguments and options + parser = argparse.ArgumentParser(prog='python -m tokenize') + parser.add_argument(dest='filename', nargs='?', + metavar='filename.py', + help='the file to tokenize; defaults to stdin') + parser.add_argument('-e', '--exact', dest='exact', action='store_true', + help='display token names using the exact type') + args = parser.parse_args() + + try: + # Tokenize the input + if args.filename: + filename = args.filename + with _builtin_open(filename, 'rb') as f: + tokens = list(tokenize(f.readline)) + else: + filename = "" + tokens = _tokenize(sys.stdin.readline, None) + + # Output the tokenization + for token in tokens: + token_type = token.type + if args.exact: + token_type = token.exact_type + token_range = "%d,%d-%d,%d:" % (token.start + token.end) + print("%-20s%-15s%-15r" % + (token_range, tok_name[token_type], token.string)) + except IndentationError as err: + line, column = err.args[1][1:3] + error(err.args[0], filename, (line, column)) + except TokenError as err: + line, column = err.args[1] + error(err.args[0], filename, (line, column)) + except SyntaxError as err: + error(err, filename) + except OSError as err: + error(err) + except KeyboardInterrupt: + print("interrupted\n") + except Exception as err: + perror("unexpected error: %s" % err) + raise + +if __name__ == "__main__": + main() diff --git a/flaskwebproject/FlaskWebProject1/Lib/types.py b/flaskwebproject/FlaskWebProject1/Lib/types.py new file mode 100644 index 0000000..d8d8470 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/types.py @@ -0,0 +1,266 @@ +""" +Define names for built-in types that aren't directly accessible as a builtin. +""" +import sys + +# Iterators in Python aren't a matter of type but of protocol. A large +# and changing number of builtin types implement *some* flavor of +# iterator. Don't check the type! Use hasattr to check for both +# "__iter__" and "__next__" attributes instead. + +def _f(): pass +FunctionType = type(_f) +LambdaType = type(lambda: None) # Same as FunctionType +CodeType = type(_f.__code__) +MappingProxyType = type(type.__dict__) +SimpleNamespace = type(sys.implementation) + +def _g(): + yield 1 +GeneratorType = type(_g()) + +async def _c(): pass +_c = _c() +CoroutineType = type(_c) +_c.close() # Prevent ResourceWarning + +async def _ag(): + yield +_ag = _ag() +AsyncGeneratorType = type(_ag) + +class _C: + def _m(self): pass +MethodType = type(_C()._m) + +BuiltinFunctionType = type(len) +BuiltinMethodType = type([].append) # Same as BuiltinFunctionType + +ModuleType = type(sys) + +try: + raise TypeError +except TypeError: + tb = sys.exc_info()[2] + TracebackType = type(tb) + FrameType = type(tb.tb_frame) + tb = None; del tb + +# For Jython, the following two types are identical +GetSetDescriptorType = type(FunctionType.__code__) +MemberDescriptorType = type(FunctionType.__globals__) + +del sys, _f, _g, _C, _c, # Not for export + + +# Provide a PEP 3115 compliant mechanism for class creation +def new_class(name, bases=(), kwds=None, exec_body=None): + """Create a class object dynamically using the appropriate metaclass.""" + meta, ns, kwds = prepare_class(name, bases, kwds) + if exec_body is not None: + exec_body(ns) + return meta(name, bases, ns, **kwds) + +def prepare_class(name, bases=(), kwds=None): + """Call the __prepare__ method of the appropriate metaclass. + + Returns (metaclass, namespace, kwds) as a 3-tuple + + *metaclass* is the appropriate metaclass + *namespace* is the prepared class namespace + *kwds* is an updated copy of the passed in kwds argument with any + 'metaclass' entry removed. If no kwds argument is passed in, this will + be an empty dict. + """ + if kwds is None: + kwds = {} + else: + kwds = dict(kwds) # Don't alter the provided mapping + if 'metaclass' in kwds: + meta = kwds.pop('metaclass') + else: + if bases: + meta = type(bases[0]) + else: + meta = type + if isinstance(meta, type): + # when meta is a type, we first determine the most-derived metaclass + # instead of invoking the initial candidate directly + meta = _calculate_meta(meta, bases) + if hasattr(meta, '__prepare__'): + ns = meta.__prepare__(name, bases, **kwds) + else: + ns = {} + return meta, ns, kwds + +def _calculate_meta(meta, bases): + """Calculate the most derived metaclass.""" + winner = meta + for base in bases: + base_meta = type(base) + if issubclass(winner, base_meta): + continue + if issubclass(base_meta, winner): + winner = base_meta + continue + # else: + raise TypeError("metaclass conflict: " + "the metaclass of a derived class " + "must be a (non-strict) subclass " + "of the metaclasses of all its bases") + return winner + +class DynamicClassAttribute: + """Route attribute access on a class to __getattr__. + + This is a descriptor, used to define attributes that act differently when + accessed through an instance and through a class. Instance access remains + normal, but access to an attribute through a class will be routed to the + class's __getattr__ method; this is done by raising AttributeError. + + This allows one to have properties active on an instance, and have virtual + attributes on the class with the same name (see Enum for an example). + + """ + def __init__(self, fget=None, fset=None, fdel=None, doc=None): + self.fget = fget + self.fset = fset + self.fdel = fdel + # next two lines make DynamicClassAttribute act the same as property + self.__doc__ = doc or fget.__doc__ + self.overwrite_doc = doc is None + # support for abstract methods + self.__isabstractmethod__ = bool(getattr(fget, '__isabstractmethod__', False)) + + def __get__(self, instance, ownerclass=None): + if instance is None: + if self.__isabstractmethod__: + return self + raise AttributeError() + elif self.fget is None: + raise AttributeError("unreadable attribute") + return self.fget(instance) + + def __set__(self, instance, value): + if self.fset is None: + raise AttributeError("can't set attribute") + self.fset(instance, value) + + def __delete__(self, instance): + if self.fdel is None: + raise AttributeError("can't delete attribute") + self.fdel(instance) + + def getter(self, fget): + fdoc = fget.__doc__ if self.overwrite_doc else None + result = type(self)(fget, self.fset, self.fdel, fdoc or self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + def setter(self, fset): + result = type(self)(self.fget, fset, self.fdel, self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + def deleter(self, fdel): + result = type(self)(self.fget, self.fset, fdel, self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + +import functools as _functools +import collections.abc as _collections_abc + +class _GeneratorWrapper: + # TODO: Implement this in C. + def __init__(self, gen): + self.__wrapped = gen + self.__isgen = gen.__class__ is GeneratorType + self.__name__ = getattr(gen, '__name__', None) + self.__qualname__ = getattr(gen, '__qualname__', None) + def send(self, val): + return self.__wrapped.send(val) + def throw(self, tp, *rest): + return self.__wrapped.throw(tp, *rest) + def close(self): + return self.__wrapped.close() + @property + def gi_code(self): + return self.__wrapped.gi_code + @property + def gi_frame(self): + return self.__wrapped.gi_frame + @property + def gi_running(self): + return self.__wrapped.gi_running + @property + def gi_yieldfrom(self): + return self.__wrapped.gi_yieldfrom + cr_code = gi_code + cr_frame = gi_frame + cr_running = gi_running + cr_await = gi_yieldfrom + def __next__(self): + return next(self.__wrapped) + def __iter__(self): + if self.__isgen: + return self.__wrapped + return self + __await__ = __iter__ + +def coroutine(func): + """Convert regular generator function to a coroutine.""" + + if not callable(func): + raise TypeError('types.coroutine() expects a callable') + + if (func.__class__ is FunctionType and + getattr(func, '__code__', None).__class__ is CodeType): + + co_flags = func.__code__.co_flags + + # Check if 'func' is a coroutine function. + # (0x180 == CO_COROUTINE | CO_ITERABLE_COROUTINE) + if co_flags & 0x180: + return func + + # Check if 'func' is a generator function. + # (0x20 == CO_GENERATOR) + if co_flags & 0x20: + # TODO: Implement this in C. + co = func.__code__ + func.__code__ = CodeType( + co.co_argcount, co.co_kwonlyargcount, co.co_nlocals, + co.co_stacksize, + co.co_flags | 0x100, # 0x100 == CO_ITERABLE_COROUTINE + co.co_code, + co.co_consts, co.co_names, co.co_varnames, co.co_filename, + co.co_name, co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) + return func + + # The following code is primarily to support functions that + # return generator-like objects (for instance generators + # compiled with Cython). + + @_functools.wraps(func) + def wrapped(*args, **kwargs): + coro = func(*args, **kwargs) + if (coro.__class__ is CoroutineType or + coro.__class__ is GeneratorType and coro.gi_code.co_flags & 0x100): + # 'coro' is a native coroutine object or an iterable coroutine + return coro + if (isinstance(coro, _collections_abc.Generator) and + not isinstance(coro, _collections_abc.Coroutine)): + # 'coro' is either a pure Python generator iterator, or it + # implements collections.abc.Generator (and does not implement + # collections.abc.Coroutine). + return _GeneratorWrapper(coro) + # 'coro' is either an instance of collections.abc.Coroutine or + # some other object -- pass it through. + return coro + + return wrapped + + +__all__ = [n for n in globals() if n[:1] != '_'] diff --git a/flaskwebproject/FlaskWebProject1/Lib/warnings.py b/flaskwebproject/FlaskWebProject1/Lib/warnings.py new file mode 100644 index 0000000..5badb0b --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/warnings.py @@ -0,0 +1,526 @@ +"""Python part of the warnings subsystem.""" + +import sys + + +__all__ = ["warn", "warn_explicit", "showwarning", + "formatwarning", "filterwarnings", "simplefilter", + "resetwarnings", "catch_warnings"] + +def showwarning(message, category, filename, lineno, file=None, line=None): + """Hook to write a warning to a file; replace if you like.""" + msg = WarningMessage(message, category, filename, lineno, file, line) + _showwarnmsg_impl(msg) + +def formatwarning(message, category, filename, lineno, line=None): + """Function to format a warning the standard way.""" + msg = WarningMessage(message, category, filename, lineno, None, line) + return _formatwarnmsg_impl(msg) + +def _showwarnmsg_impl(msg): + file = msg.file + if file is None: + file = sys.stderr + if file is None: + # sys.stderr is None when run with pythonw.exe: + # warnings get lost + return + text = _formatwarnmsg(msg) + try: + file.write(text) + except OSError: + # the file (probably stderr) is invalid - this warning gets lost. + pass + +def _formatwarnmsg_impl(msg): + s = ("%s:%s: %s: %s\n" + % (msg.filename, msg.lineno, msg.category.__name__, + msg.message)) + + if msg.line is None: + try: + import linecache + line = linecache.getline(msg.filename, msg.lineno) + except Exception: + # When a warning is logged during Python shutdown, linecache + # and the import machinery don't work anymore + line = None + linecache = None + else: + line = msg.line + if line: + line = line.strip() + s += " %s\n" % line + + if msg.source is not None: + try: + import tracemalloc + tb = tracemalloc.get_object_traceback(msg.source) + except Exception: + # When a warning is logged during Python shutdown, tracemalloc + # and the import machinery don't work anymore + tb = None + + if tb is not None: + s += 'Object allocated at (most recent call first):\n' + for frame in tb: + s += (' File "%s", lineno %s\n' + % (frame.filename, frame.lineno)) + + try: + if linecache is not None: + line = linecache.getline(frame.filename, frame.lineno) + else: + line = None + except Exception: + line = None + if line: + line = line.strip() + s += ' %s\n' % line + return s + +# Keep a reference to check if the function was replaced +_showwarning_orig = showwarning + +def _showwarnmsg(msg): + """Hook to write a warning to a file; replace if you like.""" + try: + sw = showwarning + except NameError: + pass + else: + if sw is not _showwarning_orig: + # warnings.showwarning() was replaced + if not callable(sw): + raise TypeError("warnings.showwarning() must be set to a " + "function or method") + + sw(msg.message, msg.category, msg.filename, msg.lineno, + msg.file, msg.line) + return + _showwarnmsg_impl(msg) + +# Keep a reference to check if the function was replaced +_formatwarning_orig = formatwarning + +def _formatwarnmsg(msg): + """Function to format a warning the standard way.""" + try: + fw = formatwarning + except NameError: + pass + else: + if fw is not _formatwarning_orig: + # warnings.formatwarning() was replaced + return fw(msg.message, msg.category, + msg.filename, msg.lineno, line=msg.line) + return _formatwarnmsg_impl(msg) + +def filterwarnings(action, message="", category=Warning, module="", lineno=0, + append=False): + """Insert an entry into the list of warnings filters (at the front). + + 'action' -- one of "error", "ignore", "always", "default", "module", + or "once" + 'message' -- a regex that the warning message must match + 'category' -- a class that the warning must be a subclass of + 'module' -- a regex that the module name must match + 'lineno' -- an integer line number, 0 matches all warnings + 'append' -- if true, append to the list of filters + """ + import re + assert action in ("error", "ignore", "always", "default", "module", + "once"), "invalid action: %r" % (action,) + assert isinstance(message, str), "message must be a string" + assert isinstance(category, type), "category must be a class" + assert issubclass(category, Warning), "category must be a Warning subclass" + assert isinstance(module, str), "module must be a string" + assert isinstance(lineno, int) and lineno >= 0, \ + "lineno must be an int >= 0" + _add_filter(action, re.compile(message, re.I), category, + re.compile(module), lineno, append=append) + +def simplefilter(action, category=Warning, lineno=0, append=False): + """Insert a simple entry into the list of warnings filters (at the front). + + A simple filter matches all modules and messages. + 'action' -- one of "error", "ignore", "always", "default", "module", + or "once" + 'category' -- a class that the warning must be a subclass of + 'lineno' -- an integer line number, 0 matches all warnings + 'append' -- if true, append to the list of filters + """ + assert action in ("error", "ignore", "always", "default", "module", + "once"), "invalid action: %r" % (action,) + assert isinstance(lineno, int) and lineno >= 0, \ + "lineno must be an int >= 0" + _add_filter(action, None, category, None, lineno, append=append) + +def _add_filter(*item, append): + # Remove possible duplicate filters, so new one will be placed + # in correct place. If append=True and duplicate exists, do nothing. + if not append: + try: + filters.remove(item) + except ValueError: + pass + filters.insert(0, item) + else: + if item not in filters: + filters.append(item) + _filters_mutated() + +def resetwarnings(): + """Clear the list of warning filters, so that no filters are active.""" + filters[:] = [] + _filters_mutated() + +class _OptionError(Exception): + """Exception used by option processing helpers.""" + pass + +# Helper to process -W options passed via sys.warnoptions +def _processoptions(args): + for arg in args: + try: + _setoption(arg) + except _OptionError as msg: + print("Invalid -W option ignored:", msg, file=sys.stderr) + +# Helper for _processoptions() +def _setoption(arg): + import re + parts = arg.split(':') + if len(parts) > 5: + raise _OptionError("too many fields (max 5): %r" % (arg,)) + while len(parts) < 5: + parts.append('') + action, message, category, module, lineno = [s.strip() + for s in parts] + action = _getaction(action) + message = re.escape(message) + category = _getcategory(category) + module = re.escape(module) + if module: + module = module + '$' + if lineno: + try: + lineno = int(lineno) + if lineno < 0: + raise ValueError + except (ValueError, OverflowError): + raise _OptionError("invalid lineno %r" % (lineno,)) + else: + lineno = 0 + filterwarnings(action, message, category, module, lineno) + +# Helper for _setoption() +def _getaction(action): + if not action: + return "default" + if action == "all": return "always" # Alias + for a in ('default', 'always', 'ignore', 'module', 'once', 'error'): + if a.startswith(action): + return a + raise _OptionError("invalid action: %r" % (action,)) + +# Helper for _setoption() +def _getcategory(category): + import re + if not category: + return Warning + if re.match("^[a-zA-Z0-9_]+$", category): + try: + cat = eval(category) + except NameError: + raise _OptionError("unknown warning category: %r" % (category,)) + else: + i = category.rfind(".") + module = category[:i] + klass = category[i+1:] + try: + m = __import__(module, None, None, [klass]) + except ImportError: + raise _OptionError("invalid module name: %r" % (module,)) + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) + if not issubclass(cat, Warning): + raise _OptionError("invalid warning category: %r" % (category,)) + return cat + + +def _is_internal_frame(frame): + """Signal whether the frame is an internal CPython implementation detail.""" + filename = frame.f_code.co_filename + return 'importlib' in filename and '_bootstrap' in filename + + +def _next_external_frame(frame): + """Find the next frame that doesn't involve CPython internals.""" + frame = frame.f_back + while frame is not None and _is_internal_frame(frame): + frame = frame.f_back + return frame + + +# Code typically replaced by _warnings +def warn(message, category=None, stacklevel=1, source=None): + """Issue a warning, or maybe ignore it or raise an exception.""" + # Check if message is already a Warning object + if isinstance(message, Warning): + category = message.__class__ + # Check category argument + if category is None: + category = UserWarning + if not (isinstance(category, type) and issubclass(category, Warning)): + raise TypeError("category must be a Warning subclass, " + "not '{:s}'".format(type(category).__name__)) + # Get context information + try: + if stacklevel <= 1 or _is_internal_frame(sys._getframe(1)): + # If frame is too small to care or if the warning originated in + # internal code, then do not try to hide any frames. + frame = sys._getframe(stacklevel) + else: + frame = sys._getframe(1) + # Look for one frame less since the above line starts us off. + for x in range(stacklevel-1): + frame = _next_external_frame(frame) + if frame is None: + raise ValueError + except ValueError: + globals = sys.__dict__ + lineno = 1 + else: + globals = frame.f_globals + lineno = frame.f_lineno + if '__name__' in globals: + module = globals['__name__'] + else: + module = "" + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith(".pyc"): + filename = filename[:-1] + else: + if module == "__main__": + try: + filename = sys.argv[0] + except AttributeError: + # embedded interpreters don't have sys.argv, see bug #839151 + filename = '__main__' + if not filename: + filename = module + registry = globals.setdefault("__warningregistry__", {}) + warn_explicit(message, category, filename, lineno, module, registry, + globals, source) + +def warn_explicit(message, category, filename, lineno, + module=None, registry=None, module_globals=None, + source=None): + lineno = int(lineno) + if module is None: + module = filename or "" + if module[-3:].lower() == ".py": + module = module[:-3] # XXX What about leading pathname? + if registry is None: + registry = {} + if registry.get('version', 0) != _filters_version: + registry.clear() + registry['version'] = _filters_version + if isinstance(message, Warning): + text = str(message) + category = message.__class__ + else: + text = message + message = category(message) + key = (text, category, lineno) + # Quick test for common case + if registry.get(key): + return + # Search the filters + for item in filters: + action, msg, cat, mod, ln = item + if ((msg is None or msg.match(text)) and + issubclass(category, cat) and + (mod is None or mod.match(module)) and + (ln == 0 or lineno == ln)): + break + else: + action = defaultaction + # Early exit actions + if action == "ignore": + registry[key] = 1 + return + + # Prime the linecache for formatting, in case the + # "file" is actually in a zipfile or something. + import linecache + linecache.getlines(filename, module_globals) + + if action == "error": + raise message + # Other actions + if action == "once": + registry[key] = 1 + oncekey = (text, category) + if onceregistry.get(oncekey): + return + onceregistry[oncekey] = 1 + elif action == "always": + pass + elif action == "module": + registry[key] = 1 + altkey = (text, category, 0) + if registry.get(altkey): + return + registry[altkey] = 1 + elif action == "default": + registry[key] = 1 + else: + # Unrecognized actions are errors + raise RuntimeError( + "Unrecognized action (%r) in warnings.filters:\n %s" % + (action, item)) + # Print message and context + msg = WarningMessage(message, category, filename, lineno, source) + _showwarnmsg(msg) + + +class WarningMessage(object): + + _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", + "line", "source") + + def __init__(self, message, category, filename, lineno, file=None, + line=None, source=None): + local_values = locals() + for attr in self._WARNING_DETAILS: + setattr(self, attr, local_values[attr]) + self._category_name = category.__name__ if category else None + + def __str__(self): + return ("{message : %r, category : %r, filename : %r, lineno : %s, " + "line : %r}" % (self.message, self._category_name, + self.filename, self.lineno, self.line)) + + +class catch_warnings(object): + + """A context manager that copies and restores the warnings filter upon + exiting the context. + + The 'record' argument specifies whether warnings should be captured by a + custom implementation of warnings.showwarning() and be appended to a list + returned by the context manager. Otherwise None is returned by the context + manager. The objects appended to the list are arguments whose attributes + mirror the arguments to showwarning(). + + The 'module' argument is to specify an alternative module to the module + named 'warnings' and imported under that name. This argument is only useful + when testing the warnings module itself. + + """ + + def __init__(self, *, record=False, module=None): + """Specify whether to record warnings and if an alternative module + should be used other than sys.modules['warnings']. + + For compatibility with Python 3.0, please consider all arguments to be + keyword-only. + + """ + self._record = record + self._module = sys.modules['warnings'] if module is None else module + self._entered = False + + def __repr__(self): + args = [] + if self._record: + args.append("record=True") + if self._module is not sys.modules['warnings']: + args.append("module=%r" % self._module) + name = type(self).__name__ + return "%s(%s)" % (name, ", ".join(args)) + + def __enter__(self): + if self._entered: + raise RuntimeError("Cannot enter %r twice" % self) + self._entered = True + self._filters = self._module.filters + self._module.filters = self._filters[:] + self._module._filters_mutated() + self._showwarning = self._module.showwarning + self._showwarnmsg_impl = self._module._showwarnmsg_impl + if self._record: + log = [] + self._module._showwarnmsg_impl = log.append + # Reset showwarning() to the default implementation to make sure + # that _showwarnmsg() calls _showwarnmsg_impl() + self._module.showwarning = self._module._showwarning_orig + return log + else: + return None + + def __exit__(self, *exc_info): + if not self._entered: + raise RuntimeError("Cannot exit %r without entering first" % self) + self._module.filters = self._filters + self._module._filters_mutated() + self._module.showwarning = self._showwarning + self._module._showwarnmsg_impl = self._showwarnmsg_impl + + +# filters contains a sequence of filter 5-tuples +# The components of the 5-tuple are: +# - an action: error, ignore, always, default, module, or once +# - a compiled regex that must match the warning message +# - a class representing the warning category +# - a compiled regex that must match the module that is being warned +# - a line number for the line being warning, or 0 to mean any line +# If either if the compiled regexs are None, match anything. +_warnings_defaults = False +try: + from _warnings import (filters, _defaultaction, _onceregistry, + warn, warn_explicit, _filters_mutated) + defaultaction = _defaultaction + onceregistry = _onceregistry + _warnings_defaults = True +except ImportError: + filters = [] + defaultaction = "default" + onceregistry = {} + + _filters_version = 1 + + def _filters_mutated(): + global _filters_version + _filters_version += 1 + + +# Module initialization +_processoptions(sys.warnoptions) +if not _warnings_defaults: + silence = [ImportWarning, PendingDeprecationWarning] + silence.append(DeprecationWarning) + for cls in silence: + simplefilter("ignore", category=cls) + bytes_warning = sys.flags.bytes_warning + if bytes_warning > 1: + bytes_action = "error" + elif bytes_warning: + bytes_action = "default" + else: + bytes_action = "ignore" + simplefilter(bytes_action, category=BytesWarning, append=1) + # resource usage warnings are enabled by default in pydebug mode + if hasattr(sys, 'gettotalrefcount'): + resource_action = "always" + else: + resource_action = "ignore" + simplefilter(resource_action, category=ResourceWarning, append=1) + +del _warnings_defaults diff --git a/flaskwebproject/FlaskWebProject1/Lib/weakref.py b/flaskwebproject/FlaskWebProject1/Lib/weakref.py new file mode 100644 index 0000000..787e33a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Lib/weakref.py @@ -0,0 +1,632 @@ +"""Weak reference support for Python. + +This module is an implementation of PEP 205: + +http://www.python.org/dev/peps/pep-0205/ +""" + +# Naming convention: Variables named "wr" are weak reference objects; +# they are called this instead of "ref" to avoid name collisions with +# the module-global ref() function imported from _weakref. + +from _weakref import ( + getweakrefcount, + getweakrefs, + ref, + proxy, + CallableProxyType, + ProxyType, + ReferenceType, + _remove_dead_weakref) + +from _weakrefset import WeakSet, _IterationGuard + +import collections # Import after _weakref to avoid circular import. +import sys +import itertools + +ProxyTypes = (ProxyType, CallableProxyType) + +__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", + "WeakKeyDictionary", "ReferenceType", "ProxyType", + "CallableProxyType", "ProxyTypes", "WeakValueDictionary", + "WeakSet", "WeakMethod", "finalize"] + + +class WeakMethod(ref): + """ + A custom `weakref.ref` subclass which simulates a weak reference to + a bound method, working around the lifetime problem of bound methods. + """ + + __slots__ = "_func_ref", "_meth_type", "_alive", "__weakref__" + + def __new__(cls, meth, callback=None): + try: + obj = meth.__self__ + func = meth.__func__ + except AttributeError: + raise TypeError("argument should be a bound method, not {}" + .format(type(meth))) from None + def _cb(arg): + # The self-weakref trick is needed to avoid creating a reference + # cycle. + self = self_wr() + if self._alive: + self._alive = False + if callback is not None: + callback(self) + self = ref.__new__(cls, obj, _cb) + self._func_ref = ref(func, _cb) + self._meth_type = type(meth) + self._alive = True + self_wr = ref(self) + return self + + def __call__(self): + obj = super().__call__() + func = self._func_ref() + if obj is None or func is None: + return None + return self._meth_type(func, obj) + + def __eq__(self, other): + if isinstance(other, WeakMethod): + if not self._alive or not other._alive: + return self is other + return ref.__eq__(self, other) and self._func_ref == other._func_ref + return False + + def __ne__(self, other): + if isinstance(other, WeakMethod): + if not self._alive or not other._alive: + return self is not other + return ref.__ne__(self, other) or self._func_ref != other._func_ref + return True + + __hash__ = ref.__hash__ + + +class WeakValueDictionary(collections.MutableMapping): + """Mapping class that references values weakly. + + Entries in the dictionary will be discarded when no strong + reference to the value exists anymore + """ + # We inherit the constructor without worrying about the input + # dictionary; since it uses our .update() method, we get the right + # checks (if the other dictionary is a WeakValueDictionary, + # objects are unwrapped on the way out, and we always wrap on the + # way in). + + def __init__(*args, **kw): + if not args: + raise TypeError("descriptor '__init__' of 'WeakValueDictionary' " + "object needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(wr.key) + else: + # Atomic removal is necessary since this function + # can be called asynchronously by the GC + _atomic_removal(d, wr.key) + self._remove = remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + self.data = d = {} + self.update(*args, **kw) + + def _commit_removals(self): + l = self._pending_removals + d = self.data + # We shouldn't encounter any KeyError, because this method should + # always be called *before* mutating the dict. + while l: + key = l.pop() + _remove_dead_weakref(d, key) + + def __getitem__(self, key): + if self._pending_removals: + self._commit_removals() + o = self.data[key]() + if o is None: + raise KeyError(key) + else: + return o + + def __delitem__(self, key): + if self._pending_removals: + self._commit_removals() + del self.data[key] + + def __len__(self): + if self._pending_removals: + self._commit_removals() + return len(self.data) + + def __contains__(self, key): + if self._pending_removals: + self._commit_removals() + try: + o = self.data[key]() + except KeyError: + return False + return o is not None + + def __repr__(self): + return "<%s at %#x>" % (self.__class__.__name__, id(self)) + + def __setitem__(self, key, value): + if self._pending_removals: + self._commit_removals() + self.data[key] = KeyedRef(value, self._remove, key) + + def copy(self): + if self._pending_removals: + self._commit_removals() + new = WeakValueDictionary() + for key, wr in self.data.items(): + o = wr() + if o is not None: + new[key] = o + return new + + __copy__ = copy + + def __deepcopy__(self, memo): + from copy import deepcopy + if self._pending_removals: + self._commit_removals() + new = self.__class__() + for key, wr in self.data.items(): + o = wr() + if o is not None: + new[deepcopy(key, memo)] = o + return new + + def get(self, key, default=None): + if self._pending_removals: + self._commit_removals() + try: + wr = self.data[key] + except KeyError: + return default + else: + o = wr() + if o is None: + # This should only happen + return default + else: + return o + + def items(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for k, wr in self.data.items(): + v = wr() + if v is not None: + yield k, v + + def keys(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for k, wr in self.data.items(): + if wr() is not None: + yield k + + __iter__ = keys + + def itervaluerefs(self): + """Return an iterator that yields the weak references to the values. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the values around longer than needed. + + """ + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + yield from self.data.values() + + def values(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for wr in self.data.values(): + obj = wr() + if obj is not None: + yield obj + + def popitem(self): + if self._pending_removals: + self._commit_removals() + while True: + key, wr = self.data.popitem() + o = wr() + if o is not None: + return key, o + + def pop(self, key, *args): + if self._pending_removals: + self._commit_removals() + try: + o = self.data.pop(key)() + except KeyError: + o = None + if o is None: + if args: + return args[0] + else: + raise KeyError(key) + else: + return o + + def setdefault(self, key, default=None): + try: + o = self.data[key]() + except KeyError: + o = None + if o is None: + if self._pending_removals: + self._commit_removals() + self.data[key] = KeyedRef(default, self._remove, key) + return default + else: + return o + + def update(*args, **kwargs): + if not args: + raise TypeError("descriptor 'update' of 'WeakValueDictionary' " + "object needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + dict = args[0] if args else None + if self._pending_removals: + self._commit_removals() + d = self.data + if dict is not None: + if not hasattr(dict, "items"): + dict = type({})(dict) + for key, o in dict.items(): + d[key] = KeyedRef(o, self._remove, key) + if len(kwargs): + self.update(kwargs) + + def valuerefs(self): + """Return a list of weak references to the values. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the values around longer than needed. + + """ + if self._pending_removals: + self._commit_removals() + return list(self.data.values()) + + +class KeyedRef(ref): + """Specialized reference that includes a key corresponding to the value. + + This is used in the WeakValueDictionary to avoid having to create + a function object for each key stored in the mapping. A shared + callback object can use the 'key' attribute of a KeyedRef instead + of getting a reference to the key from an enclosing scope. + + """ + + __slots__ = "key", + + def __new__(type, ob, callback, key): + self = ref.__new__(type, ob, callback) + self.key = key + return self + + def __init__(self, ob, callback, key): + super().__init__(ob, callback) + + +class WeakKeyDictionary(collections.MutableMapping): + """ Mapping class that references keys weakly. + + Entries in the dictionary will be discarded when there is no + longer a strong reference to the key. This can be used to + associate additional data with an object owned by other parts of + an application without adding attributes to those objects. This + can be especially useful with objects that override attribute + accesses. + """ + + def __init__(self, dict=None): + self.data = {} + def remove(k, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(k) + else: + del self.data[k] + self._remove = remove + # A list of dead weakrefs (keys to be removed) + self._pending_removals = [] + self._iterating = set() + self._dirty_len = False + if dict is not None: + self.update(dict) + + def _commit_removals(self): + # NOTE: We don't need to call this method before mutating the dict, + # because a dead weakref never compares equal to a live weakref, + # even if they happened to refer to equal objects. + # However, it means keys may already have been removed. + l = self._pending_removals + d = self.data + while l: + try: + del d[l.pop()] + except KeyError: + pass + + def _scrub_removals(self): + d = self.data + self._pending_removals = [k for k in self._pending_removals if k in d] + self._dirty_len = False + + def __delitem__(self, key): + self._dirty_len = True + del self.data[ref(key)] + + def __getitem__(self, key): + return self.data[ref(key)] + + def __len__(self): + if self._dirty_len and self._pending_removals: + # self._pending_removals may still contain keys which were + # explicitly removed, we have to scrub them (see issue #21173). + self._scrub_removals() + return len(self.data) - len(self._pending_removals) + + def __repr__(self): + return "<%s at %#x>" % (self.__class__.__name__, id(self)) + + def __setitem__(self, key, value): + self.data[ref(key, self._remove)] = value + + def copy(self): + new = WeakKeyDictionary() + for key, value in self.data.items(): + o = key() + if o is not None: + new[o] = value + return new + + __copy__ = copy + + def __deepcopy__(self, memo): + from copy import deepcopy + new = self.__class__() + for key, value in self.data.items(): + o = key() + if o is not None: + new[o] = deepcopy(value, memo) + return new + + def get(self, key, default=None): + return self.data.get(ref(key),default) + + def __contains__(self, key): + try: + wr = ref(key) + except TypeError: + return False + return wr in self.data + + def items(self): + with _IterationGuard(self): + for wr, value in self.data.items(): + key = wr() + if key is not None: + yield key, value + + def keys(self): + with _IterationGuard(self): + for wr in self.data: + obj = wr() + if obj is not None: + yield obj + + __iter__ = keys + + def values(self): + with _IterationGuard(self): + for wr, value in self.data.items(): + if wr() is not None: + yield value + + def keyrefs(self): + """Return a list of weak references to the keys. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the keys around longer than needed. + + """ + return list(self.data) + + def popitem(self): + self._dirty_len = True + while True: + key, value = self.data.popitem() + o = key() + if o is not None: + return o, value + + def pop(self, key, *args): + self._dirty_len = True + return self.data.pop(ref(key), *args) + + def setdefault(self, key, default=None): + return self.data.setdefault(ref(key, self._remove),default) + + def update(self, dict=None, **kwargs): + d = self.data + if dict is not None: + if not hasattr(dict, "items"): + dict = type({})(dict) + for key, value in dict.items(): + d[ref(key, self._remove)] = value + if len(kwargs): + self.update(kwargs) + + +class finalize: + """Class for finalization of weakrefable objects + + finalize(obj, func, *args, **kwargs) returns a callable finalizer + object which will be called when obj is garbage collected. The + first time the finalizer is called it evaluates func(*arg, **kwargs) + and returns the result. After this the finalizer is dead, and + calling it just returns None. + + When the program exits any remaining finalizers for which the + atexit attribute is true will be run in reverse order of creation. + By default atexit is true. + """ + + # Finalizer objects don't have any state of their own. They are + # just used as keys to lookup _Info objects in the registry. This + # ensures that they cannot be part of a ref-cycle. + + __slots__ = () + _registry = {} + _shutdown = False + _index_iter = itertools.count() + _dirty = False + _registered_with_atexit = False + + class _Info: + __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") + + def __init__(self, obj, func, *args, **kwargs): + if not self._registered_with_atexit: + # We may register the exit function more than once because + # of a thread race, but that is harmless + import atexit + atexit.register(self._exitfunc) + finalize._registered_with_atexit = True + info = self._Info() + info.weakref = ref(obj, self) + info.func = func + info.args = args + info.kwargs = kwargs or None + info.atexit = True + info.index = next(self._index_iter) + self._registry[self] = info + finalize._dirty = True + + def __call__(self, _=None): + """If alive then mark as dead and return func(*args, **kwargs); + otherwise return None""" + info = self._registry.pop(self, None) + if info and not self._shutdown: + return info.func(*info.args, **(info.kwargs or {})) + + def detach(self): + """If alive then mark as dead and return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None and self._registry.pop(self, None): + return (obj, info.func, info.args, info.kwargs or {}) + + def peek(self): + """If alive then return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None: + return (obj, info.func, info.args, info.kwargs or {}) + + @property + def alive(self): + """Whether finalizer is alive""" + return self in self._registry + + @property + def atexit(self): + """Whether finalizer should be called at exit""" + info = self._registry.get(self) + return bool(info) and info.atexit + + @atexit.setter + def atexit(self, value): + info = self._registry.get(self) + if info: + info.atexit = bool(value) + + def __repr__(self): + info = self._registry.get(self) + obj = info and info.weakref() + if obj is None: + return '<%s object at %#x; dead>' % (type(self).__name__, id(self)) + else: + return '<%s object at %#x; for %r at %#x>' % \ + (type(self).__name__, id(self), type(obj).__name__, id(obj)) + + @classmethod + def _select_for_exit(cls): + # Return live finalizers marked for exit, oldest first + L = [(f,i) for (f,i) in cls._registry.items() if i.atexit] + L.sort(key=lambda item:item[1].index) + return [f for (f,i) in L] + + @classmethod + def _exitfunc(cls): + # At shutdown invoke finalizers for which atexit is true. + # This is called once all other non-daemonic threads have been + # joined. + reenable_gc = False + try: + if cls._registry: + import gc + if gc.isenabled(): + reenable_gc = True + gc.disable() + pending = None + while True: + if pending is None or finalize._dirty: + pending = cls._select_for_exit() + finalize._dirty = False + if not pending: + break + f = pending.pop() + try: + # gc is disabled, so (assuming no daemonic + # threads) the following is the only line in + # this function which might trigger creation + # of a new finalizer + f() + except Exception: + sys.excepthook(*sys.exc_info()) + assert f not in cls._registry + finally: + # prevent any more finalizers from executing during shutdown + finalize._shutdown = True + if reenable_gc: + gc.enable() diff --git a/flaskwebproject/FlaskWebProject1/Scripts/activate b/flaskwebproject/FlaskWebProject1/Scripts/activate new file mode 100644 index 0000000..c73d6a7 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Scripts/activate @@ -0,0 +1,78 @@ +# 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="$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u 'd:\Projects\tvinterface-Flask\FlaskWebProject1\FlaskWebProject1\FlaskWebProject1'; else echo '/d/Projects/tvinterface-Flask/FlaskWebProject1/FlaskWebProject1/FlaskWebProject1'; fi;)" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$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 + +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/flaskwebproject/FlaskWebProject1/Scripts/activate.bat b/flaskwebproject/FlaskWebProject1/Scripts/activate.bat new file mode 100644 index 0000000..1c9984a --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Scripts/activate.bat @@ -0,0 +1,30 @@ +@echo off +set "VIRTUAL_ENV=d:\Projects\tvinterface-Flask\FlaskWebProject1\FlaskWebProject1\FlaskWebProject1" + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) else ( + if not defined PROMPT ( + set "PROMPT=$P$G" + ) + set "_OLD_VIRTUAL_PROMPT=%PROMPT%" +) +set "PROMPT=(FlaskWebProject1) %PROMPT%" + +REM Don't use () to avoid problems with them in %PATH% +if defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" +:ENDIFVHOME + +set PYTHONHOME= + +REM if defined _OLD_VIRTUAL_PATH ( +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH1 + set "PATH=%_OLD_VIRTUAL_PATH%" +:ENDIFVPATH1 +REM ) else ( +if defined _OLD_VIRTUAL_PATH goto ENDIFVPATH2 + set "_OLD_VIRTUAL_PATH=%PATH%" +:ENDIFVPATH2 + +set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" diff --git a/flaskwebproject/FlaskWebProject1/Scripts/activate.ps1 b/flaskwebproject/FlaskWebProject1/Scripts/activate.ps1 new file mode 100644 index 0000000..24730f8 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Scripts/activate.ps1 @@ -0,0 +1,150 @@ +# This file must be dot sourced from PoSh; you cannot run it +# directly. Do this: . ./activate.ps1 + +# FIXME: clean up unused vars. +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent +$script:DIR_NAME = split-path $BASE_DIR -Leaf + +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 + } +} + +# 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/Scripts;" + $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 + } +} + +# SIG # Begin signature block +# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf +# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG +# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp +# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy +# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw +# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp +# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV +# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0 +# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J +# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj +# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR +# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU +# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC +# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV +# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L +# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh +# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al +# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0 +# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG +# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB +# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj +# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va +# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95 +# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh +# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B +# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU +# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt +# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g +# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U +# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L +# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG +# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B +# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq +# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 +# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx +# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg +# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe +# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G +# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM +# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ +# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui +# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA +# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5 +# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT +# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH +# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx +# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa +# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT +# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN +# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/ +# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB +# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH +# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD +# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P +# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3 +# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s +# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50 +# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm +# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz +# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl +# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm +# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs +# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0 +# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg +# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM +# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w +# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB +# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz +# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh +# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud +# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC +# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL +# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1 +# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF +# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF +# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4 +# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ +# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0 +# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg +# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg +# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE +# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ +# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ +# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO +# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK +# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR +# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb +# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9 +# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb +# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL +# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud +# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1 +# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG +# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw== +# SIG # End signature block diff --git a/flaskwebproject/FlaskWebProject1/Scripts/activate_this.py b/flaskwebproject/FlaskWebProject1/Scripts/activate_this.py new file mode 100644 index 0000000..444d3fd --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Scripts/activate_this.py @@ -0,0 +1,36 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))" + ) +import os +import site +import sys + +old_os_path = os.environ.get("PATH", "") +os.environ["PATH"] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == "win32": + site_packages = os.path.join(base, "Lib", "site-packages") +else: + site_packages = os.path.join(base, "lib", "python%s" % sys.version[:3], "site-packages") +prev_sys_path = list(sys.path) + +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/flaskwebproject/FlaskWebProject1/Scripts/deactivate.bat b/flaskwebproject/FlaskWebProject1/Scripts/deactivate.bat new file mode 100644 index 0000000..5ad81d4 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/Scripts/deactivate.bat @@ -0,0 +1,20 @@ +@echo off + +set VIRTUAL_ENV= + +REM Don't use () to avoid problems with them in %PATH% +if not defined _OLD_VIRTUAL_PROMPT goto ENDIFVPROMPT + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" + set _OLD_VIRTUAL_PROMPT= +:ENDIFVPROMPT + +if not defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +:ENDIFVHOME + +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH + set "PATH=%_OLD_VIRTUAL_PATH%" + set _OLD_VIRTUAL_PATH= +:ENDIFVPATH + diff --git a/flaskwebproject/FlaskWebProject1/Scripts/easy_install-3.6.exe b/flaskwebproject/FlaskWebProject1/Scripts/easy_install-3.6.exe new file mode 100644 index 0000000000000000000000000000000000000000..68e25fcfa0eb0f1347fc510b7df92155b45024e9 GIT binary patch literal 102838 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�?dYNUd4WaURX_A__M4W}D0!0n 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 VIfNZOBmehNNB+2-zN!q){sWR=PLlut literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/Scripts/pip.exe b/flaskwebproject/FlaskWebProject1/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..9ad64adbf95ec86e5402d2e17979f0d7c95c6166 GIT binary patch literal 102820 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�?dYNUd4WaURX_A__M4W}D0!0n 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 BNQ(df literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/Scripts/python.exe b/flaskwebproject/FlaskWebProject1/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..d99e5bcf5cd249e587cc36be13d69c01a2cf47be GIT binary patch literal 100504 zcmeFZcUY6l(=dF8UJW8mQ3!})0fK-EN(llQ6a=MNfY3rwnsfw0=ZF!(iXID!1#Dmk zMIneZQ9%(wdJ&0$(gZ@yH+K@w!Snpi^SsyfegC}g_ujfYv$MOiv$M0aEo#0m4dF%* zga-nXi6Hp^(T~82|NDpm*$d>KFF+m(zEjA@n7vc5_VfzG`3LxU1UUQPT%CP={eo~V zWL!Y7FV4#sXKZ1G^YL>dtBHyVDREeTe(?0-$(n}hxo{zSNA)>K-#Y%~eHsfkabU~) zcviak{ds^0F|3$~o^Nu*#9W{h%PKOH`*Ue%=7*eFOyAGB5dmG)iQyxTSy~ zZ|6Sdia+NkIb?Tttb77X55&!)m3Rah4i+aC7mK-%7c-f|!Cb>7#NtY^@3P=Ypa#K; z7~hY3hANewun?lPA_zjQpy#0Y7l??|2KpkPv5F*f)5ir6B!L#>P0xYJM@$hN0YFz2 zhNv4NsJR^~CDMXz=|d=y096xdK_XDH7)`H4`HrL57#dYV1a;g{Y75}NnU}r*P34Lr zh$f8~{~EWy|J-RQ8EmU6h9Sh8$pRBx7 zLLf3qL=6*Y$@WSD#N;3)F+0dsXDgu!+Df1W3$q)#0gT=fG{y)=f|PJ{1DGgB8>pho zwGbqJ0uwC6E))ZW5-WqZm-F&L2C7P8ilhaOr5<$vbPF+-5`^->X(QkJ*##D`3yjM{ zfmKkToVP-gZQ^|bgr^u*i$|;I1E6m@AG81iL5$Z%f)t6MFg^AtND-;BL~0fNIds}Y zlV+G=$)#DztfjZ29p#jlK+B7=%L@>x!t^0<3-m^ah*SpsEekf#uK+Zo(uh=PC~<0r z$%J872Q7mt_@RMQkWEM!3+AO~0jBx!0fv4USW-*+6rdnKyPyCR^oQ)XF_B6*1j@!j zf?7hP+A9%=)F34y=w6*v!XAq}L3HF*wynXw9A3i!mlgSz9J0Kd1^O9MV#+3~VF5U;CLf2u5EIZG#!}KSM3&-DRN|d5W^CEal8u#QlC71* zejkflqJIfV;0XB&_|RL>PH_g~7An-d!O&p~c@hQ5yxdT{ocB8{VQeA007He0k5nQe zA!0;;mPoKbxiKU;*1g@ z#ArPofPsoAjcNw;VrnHgi#Vug1~f}kDi4jA%=4!24X8sG?2v8%bCENEsK3IYbAkZ2 z%#<{Ntp<@=fbQ&wDb`AsL~1qo0H)*$ln$e)L5z1((uO=Ur9DIt%hC+y8>mvAui`rlh_w}vVMgVh zS%uPz4XHKH2p~m#r@`7ckZGz(gM7%KqA3;+bX~CH{mZ||34?ZB4RsB%dBy?~<|!gD zv1u}9+!ZVWA2CHF#yo|m(tLA8kengaRD`(sLx8X$)lh)Dn7FwnfX_6(cvWAADYdwS z)zn)eID2jlT1me7J_K>s!32*Gfjg1AI940oss?|3CJd9+U56-xJ&npnCQ^A;p!*wC zPE@ug@O_{#g}*Y0RH8s1FA)Tg(4-9#u@6KmU^)f=)IfdGs*?MdzVW#=EQ4K_pZ*>e zs=mc^KiB|*gWn{?V#%XH>*J?uLgGG#RTXVdvyyHI=AA&po?-Kw<8=YbfrCdYiPMj> z6a4gKK>GUU)u)F7g&qJAhlti^ubtjXV(0=Y!}8Ro)Cp7SAhnT5{Z40qpMhO~bo>+s zwjb1Lx-^JuMlI9)NTj}F)}!{Z2POa*E$YCj-rzQ2g&=^;;L1Iqk8?8SvKR%4!F+gu z&R)>RcQWMDf3g$-tBfQd^ZWXNlm1=-2;28#pYrBH<;2PYbedz0OOEhnK$?CO93lM# z6ysH$h8zQwIor2UaumiyUaTEB_h1oK$O>7EQ200~A z)=$_pRJVtLCWF$hvS?rweI7)rr0PlpF^#WaQeUy{x!quG#eIxvZH1ZUE3;&ib_jH= z7z+*#W5vt|u?u;hf#>?Kc?(4!0DZ2^Jr=%D^a(&zy_V1cf1_>pC967h$XkSJ6+ zLSWo{0J&JUE`#csJ!VJ0&>z9@Xnus5BAn0^%uoD7^5GiRP{VMr%f#r_0|hzyC5R{C zWAFmlF4cgU0jLDPGFEit=GK470wq)1;1A43JGOr#O9##P{9IF&D{ zgyvjhn@gal#jrx2SdKPg4_mhJ8b}^RlQ0b&SRQb0uZDWVe1yRAYbcHe=&{XeD9l`u z1Fb`!Q$$T5{ap&I?>?sF?JFRnftbRp2lSG^AnF%;KqO+k01y2e8{uN>N0X+*D*+Oq z-W1BO;M7CciIVsgya0d?>W^%QDR-3!Q@|v)pN9JXFYIkiDBxg4Jk+XptK(OES_KtA zDTA6H4fAWjebS>LLJ3UCA#uQ{m*}h#XBtpCwTiW>R--wQ*ss#Lg0~w z#+qbl3cNMSDDR6(HJ}<|>}yn84lExR+mDKYN(FKor)=@0JELNtDW>Ew@E9{zvd82L zK_P4&Y$C8G#ZVuu!?F$bdc%~ogpzRZ0FANc`^LZ4%HiMF%C5iG%HW3h`~+aLAf!4z zAKhjkbITRjkRT+%rZj*ndma&~m{@JsK%e&DrSV}hJi$^_A}%GiebW0|JcBC)8#{pz z&SQf3VV{C7pmY=H!`zz1Iq%_!Da#tA(5|ho1<(g)sm;VhW)OISYPuJ+2dh+ki2!kP zYd|+=l?p;P_pm^r>-cYHN0irPHm~&m!VA5N`tNx$S9G8qLwSl3lOvU6=A1!1nGXI( z6V3=SIQH2Pn`ulfF6ZTiBx(Y&L#~GA#>Uh)#?+67u|s6vATPt%VJ}~@sbTD(ZxGqr zM7YM7+GI@S?OK5#hOr}t!9kuT!e6Mh#=>7>hqsY^gEcFu3}fMstVxZ{Og0%brdAp! zn=_~t$qv7gZKh4YW$z}&i(Z0*D$_8&f@j5`0TXKsJ_0!E(fBY(&?-GAJ}x9kLC+rr zOL*^3Of%ydxKLRltheYN&@%Q~NuV%P$3RUxsA&R=<>J^51UrZh7S;)YEf+9{Tph^G z2TzP7+q8oqUpF%%l{70^qM;I*GeD?h2Rin7mmrHH7u4ZJdxw4AAra_X&P#{uJXq#n zi{A+txL#J4Y@iidVrifmFvHXki#u^d;TmGHjTm@SF(p1-zF-Y1?_;PDUm;M=dkqjU z8f46bj!Wjf1gW4!@fEmo-lKr>qSEmm0SvVaZLl(GBzyCMP9oG_#Xug|ZwbrSQAIIu zz=vh^C-^ley!j29^_IEfA)L41yvd5u`xNGiFgR#3R~%r)pIDTgES$iKHCV9{E9PUx z0<2hw6-TmSTUI>3{96{E_pI2T74Kuk#;lTRtoRCx62OXsSaAp|4r9fKSuvZ>PZnMQ zhcM;}^xlEF;w~$`%!<=kaU3fSV#V&Pcn>Sy&Wd$e@mW@UgcYA;#iv=Z6vS`eqHD!J z1AF(4?q249f8Td8+X*({e{e)fqOX6m;+aGpb!U+>9OlKb6^Dr(mDC>IdGN(#X0TH zDJgps8*Ar48VAnhZ_u5?*bw)RwA|+3^W!-A*Ex{Jfz2HFivvA5kj|+;%zgtFh&^G)<3uC>3&_FmfFZ8`dX+2sG`p9laUES5)13_vaEr8ZB+6^aYBSW-I!#`*! zvHf@2KC~SDH<~G{?%+RYD3S3Gnh{!AV}84)EPevN(JWc~#D1r-%E|mjvu2gU0ga_U zRzIv+<8{z~$0?6$5G^KDrS#OO5ZlIxWXG-cY zLckMh6SXmOG?ttw{eSwPs|W@Z&9eod5Dy}x#fJ!K@cCn4_r|BerT$kQr;H$$55c+# zB3LZ}1iM?R#9VYLK7S|JcX4isXzFbJ3BymsdJ{1b}u zAfj4Ah-d(xB}PI3k#K`x&5uZcJ|r~6{Qr`3PTv1j$l@!Ah-v`exjOt@2tQ`g-+hj$|V6UAIgQzqh$jv z8))dfnESNRy#vtx)AxV(GiRpWNhBjupg-Bw z%iYVBnIFKCR;~eBk z4uBRHBP3TpUw1E$-~ciy)XR-bat`naL6G$bwC@$<gU6j$>2B5q5~*1Uu(Y30ReuY9KC7&rZ-O3 ze8nJIzm@RwWr-N%?BWf**PYiJPL6x9uWOK(pD+BH2knz+a5)mPYs zaZ;p1!CtNh*-An@5Og5Ce4!BH?C+)O6Q~;M<*N$yRN>c5L0&#&Rqu7G>r~mM^p6s# zt<2B=8Q|wihAqfZUh6si&5@88Zqq~ghR84wIzUD- z#Fg9hugPg;2G&mm!$-nFB4e^ku!jdZU`~=67LOojP>#PTI21c16s4H^xdnTZi7dZk zhafvlcJDMX)6`&llK-?4{qI4WdlPu)fcxnF39gdhW9{WYd@cxh-0%HB^ZxJme~t#! z#Sml{1oXTDcLNCe(E<*-K&1H1xYGXyih z`vEF00)Bv_zn|Oy;XdHn0KFj$0**pG3E0;GP5@{Hp#pGgfCCWn0Urc73y%{tz+uTj zd>}Lc?hmj7!dJjo!B1&)AzayrAg=+=Ku`x9792ziLKxsEG=<;~xEa782x)+$Fd4!* zz>fj^0l^;dL4df$u>S=dg<24f0FJ^a2n4`m0GciV9RO|yup5E^;B_<>1y5a5sQgAiMzlIzR@5 z*MJMa?KuHLGvFvZ3gIi@#{hnY@C)#EfH&bx!=nv-fwK&Hu95*9h3MJl3dn%MJrGtw z`TzU<|4Retn;Uxn22&p~fe-)zH3MNz0Pugm|KDhUhxI(A4(<&eWRNQWQM;!5KETO^VmZNP`cB<(Ea~~&hGqw z<&*X=<*)n;{rQ!Fz^l3Qw$F9-4y8RN%nCLRQ2(44e$%}a}QF5BlRZd zKp(Y`b&5DR7J0eD?S}3A)_@fbryCRy92kV2R{j^cX)3bnLCruoAP0B_g>%wC2_PQ| zhE~XKmH}QNaDMV22mX~gKihm<_`mwbs;&zf@plgLa`Ey8ssHEh{#G1SBS#2bxa9Hn zas^I)zJJRV80_!w7XW>Sf2w5arl%M|)=*!!PHX)})phH&HmGW8x~^AsUhhs;Rae(` zBa_LRZkq1uQS*EDUpQ#4U#F?s?$_wKd(;-8ZA4T*Z>!DNBFTgOs)zd48?22B>=qav& zoM0E2A3Mn5)-apFwQX1rCbL0notBoXtNS`PcSW4Hv#&?6vj@BQ+~n59|L6YwO=oEW zH1&7y!OtdJ?%XCSw1l-CH6Mu z#)j5m7k^v|KW%Rp)l+1X>u6&aT(IKKJ<%%L9cL38WzS;1NZ}TH_8~-?fCrh-p_rl zwjuu|~s6Sxy@`?A%*{P|Sp99}Qel`mxIZG)|Oi(aM&fl=M zh{&TO&b%~rs?7gu^xP|NKmSsPD{w%D-C*pB=TLD=|pZRF{GWkBKF+}F(wu^cPTwTIVBO+bGE3!PA-Bzu6(S%b*z2Y ziyv{dLzCt^{L4jU6)ifB%Wh~Ny>Pa@z`|^-ncE4v%>7!{w`q}}ZaA0H^v$bAdH1=T z&S8wKxsb_~(?~f8ysJbg#+gs#&|7AU@=Di|SVvY`U>Bp!ze(;z$5Xv18?L3?PUoa@ z9ix}b_W!xQu?xF2yR(fFkvk-Z58q`X`y;xNx+aW4u!;B~dZGL@#$eq_|B`R(n#bBd zoF<)I1}d*z4qAZ6-r2#}1AR-^=jnw>NN&zG8+{4v!v@ZF>q%0OigzK0EH8_^Rv+QF z;B%3=d2kO#{jH+==XEg`jz_kJMOItQtafrbS4w+*Q}EM)^{1=48=hLOqK)Vx8{hZN z_CsMVTCjtJP$E$D;xNwIee^BBun8V}30j<2z@Vy$_n5r-n{ynY&BvF8lqIBW>=X)Tce+61=ZvE%8^Op zzO6CN-(-Q|La8wKn!g(M&|Xdx(EyH`7Z*D5Ek2H_09p&=DVTkWd$le`C(a?-U2Lwn z`X7VpF^jdd`Tjys6Q8TZ>JV);7r)GT-*y>5cxCo3RKG-97sGpOdxK6bEr_ceky2Ob zf9pNR@IHaqx0dD_eN$GOkBu7=P~87$@gdC3McRD8{~VcEYz4T zao+RCy$On_JMDqb=9SY+xwTE4Iy@f2j~kNqzV;VsmnbE5RFAI(?dL#NhXQhnHwP@r zM5G+qxhqV7<`(OU2p{R_^#4|^%j5L$zGok@wP?epz6i$JNZ`EJuY2m&<%KUdb`D$` zJMV1fzl^4WE57(cO5h-)yLwnhr1l`F05_{n(}X_VU}w9BNqA-N+AQSdV|b?NgIBe&=su8RtqPWS{}7R zhKre5Leq&8#nh-{wnqsothZd)=y!Zs)60mBl(9z{9fearOS&v{^)39e|ImxUY?We^ zYN#|Ep0M?9dMb*K`o5#5?%{Y`itI+0uCkQ;*~z{K(M(F@Ktx-KLugClwesWd$M0Z> zhmob+GB`6X%56brug#sIvW& zsqN4Ea!N+)Nd_L(7jJL!%-4@Z>YfWDgK;a}FCrzSxXz@>GeaQ51~6> z9`CFX+di>!iJ@9!+50@|hp~po+_d7MTe?W_GQ(1#!A#AwPCt4z?;jfV3j6YW-Cfd` zFQ5AFgw{4psC%|9yhCWD=KM;pFz_!+rObIRtv&jLrBNj=}0hNTlj* zOkRGfj#y!0_6mzUIqxO$M-qZ-JXurqO1`Bw7)jVp8`rfyDs?+k`GZLNl)g&UtIDKQ zy+2kCeGM%4mqw}{-XGSI&CT~;7UHeH_L0V(NA9Bf%!%r*Zx{T^E@zFoJ$K*WFX9w? zzvd6Fbnn9J%RAa87$c1IZ3{Y2yxg{HO{1rF$2o@;)1Bj+sw}o(&pAZnB&N4lZoRf1 z&Td-V*2})XwwJS2z-n>t;gv1ydG%0*QHX6DKh&O(>Nib46xp>cwd-Tbox%ON`dI19 zFI7hKQbG3?%wHCVs#NoSy$p%bLv9WnQg(Ck*Nu8&-EO$HurI8khTM4^_f) z;^Q2QugUGJgC@Ib*GG2t85GO6QT%!%a`!&slYcQ0f2${$syjB2IEB5>wZ|Ho^J`)3 zFFRNi%ygXY#*Wd1w;bGG(bKNgyGqhWJ7tqf{Q5OKIlCFFn8EZ4-wIUGykK1)`}z%q|Sw!SjZA3QkSAst#A{Lbhicmb!r?)@n}Z>5?RNV+x_ zxFt#w zy9q9zip28o3nh9A5YnpfzQTsfA2WU_6Abka31^qjX7>5z-IVSbvAv#PpB0;-8!o{7 zAy2tJlk$41b-eIX;B&(TTw_AENYrb$L;R+T!6}+Yygd{(UCC@&Hnme^a<6T~o#j5w z@_Kh1Q|+Uz3N!4PNg2ZT3}&8`O;^$~90xH<_R+7@&blmC+kjuaHB?`vCs@N@e+ zzr&Bl!tyMQ(zaZ!(d@&j#Hi3dHD$rRVDgm&UstFo(_hBU{!ro=!(cX&B+WMVivu4v(MW-y%9Yn&IhX2NVN05^CT%} z*V{i9!aEc#?X$a_bfBg5YUQR7J&M5QXi19`w-P{^{<;QhzCI9240&9%qWMPTqB?v1 ziAZruwavFlvhmfdYQ@Y!?wEms`*$rHnDnuXt|sR9C10<+S3wsr7|ufjQQwP8?xykA z?C9X%gHbuG)*N%#SjdPkuhBYEeIwnmu~r)^$u+vf7NK4o8anjjL3C8% zk{=hEXZPp6#MM4Ji(lP^&HW;AW2)kZa;$Vloj|~k3W_G-M)uyr=ETv;v!snb{XQKW zwBPo9mKtl2wM&@$@>$WWh0=wm*7LVThvkmtH9k$Ds(tjZ-E_k)(Lm!aBBgU}$FEbQ z%bOij;-YV^i&nPs#_L8bR@3wIxz2O@cxq>j<(_Xlq}qZl-)wC98LcLt(Y&1SfwJ&S zH-Bf`&IyXnfQ5F-lA|}q1~P{X5T019tbQT0{Sop@XTto#hSfy_Nsc#XjbZ!(-pd#m zMfA51-F{HkHm+w+`FZqs#98k^e#@xLIi|9p_q1c`jG!&DB#Bz`Xi}FHGu8EAkI|CMAwd=j@BgS{7Af zezCUgT_*imq`uJXip<$WE+Ip1$HMEE8-){WNlT{=^2i^to3QEE?X?`2z*UT(6~lJR3=VXe?C%aN{Svk1 zLF(#GiyVWP*9|0(iITR4S-;G{nH@%wTD^6zA5g9is~^U!MOJFwrckWv`1HqTlrT9RmP+()fK5q5&gV5c3C;?2H90Oj_cv|Y}6OLjdze8#EvO`_IE zeTKfLQ`K6FJ|RxlxJCn%CwqFzG|O552e7LNQ~=U$vY|}$EB{9 zWxZX#?E1_0_8KA zgH5I4{VuCF@X+)4Yw&Qm-1>E=0qoND*eWz~4IM8WrYLyc`%ynEvwgxnpksmHE_(1Q ze9z?f&4*56uUL#HpNjaHIeW%ML45Y3<%(ZI*A)l`uE@+e9%ER`U%M^i%1(Hxt;N$e z?vkQQ?vUOec|tLJQ{i4lsn<)sDlksW>wuZeDg4=SE=${q50q<;HlKykq@AR9z~Jn% z;Cisput+zC!Y{oSqvG;033-Q$8HiYw_wC7ryG3t=#S~1gY})E3IZMABH=53CAayl# z$*$WLHa!+{$c=GzJ{Rb|>Mr|6huLiJUyE6yjJj)DY@W>^;_HyckAOVDJ)A zhjeWA6xC1o)Cq4!jD*0atBXDsMEi&KK2fZ#t@YGel3jN|JK(Fp@ufO(FC)fX23lWg zM>71kjlbbq8^c?X6u7~u>8Ve{L$dG&-{yvN4;5LpjwHM9oB66?>G8x-J*(-EQ;YJu~-hOtta~X|;Y5 z>uj>^^2Ihn?HYxiKe*QYkXCmIKj)2HJ0pJcc1m_(w5ecrfjN1bGv4o7yKTppGYwK_ zMTvn!cPMg_YmfY}+n;x>`vvOhKkN<}$DA}Y*mC#lDdq7a--}eVtgABR3)j~^5xl#i zc$+f;%QJ@z$y9nBGF@brg*2IJ+1>uvHL70oOWlJhb!X1>fy@0}W=}Oa?7? zsD&T?(c$eUOV)I2T->_sOu*v0eX8rISapG-u$^TR^7k5zc7)WfDSUj`Z}`hMua`eQ zwvIh^)M;0y)MwkA!0%gk$9w=URNy@mPy3@M=|POWn!KO^VPf`u8B-7&b9cR9bk0&c zo?(xcP{k)xB}Kzku^&QZ+On)xs1FJ`_5QH>u6&7Wy7;UCEk(M`Q}+**S-XKIVLZWY zh7E9au@@SlouwzV}&12Gc%#n(?d%H#U>hk(+vgR7y7E9hJ`!aUtX~Yix z)4HPZhiy9~XN^v+kNmp7=yltyKlTOkA;4khwc}g#`P;@VEAB8e?)(|Prh4Q>!;&Z- z!J_;ak1Y(z;%9@Ge^lyukqZeQhpD^<3FijV+eo~E(bpVPR&x)-masnfw#8!ZiY-|s z@mmfO>2jFk6fXa<#TIQ~+qGd^gl&AaLYaLfq#(2`!H zsUW0VBQ^Qzi2q%_rBn6+6(1DtB8Q2}!U+qc{}>utYv8NfQ~a`g=zBDU>(nS>dlkWZ zZrx%LYp`VG4$m(8;%&U|daqrMdW^-b`=;E%zvWJwfXWX=xn#*m4YQvoRA0UshJ`#b z_eaht{DyuK-#5Y9$FH8D7!gtR=LdVEF?c_Wq2A6w}s>v!fG z?|m-1g64ZO_Z9vlSucqZ(=~3Q(E&ZzPDEJ5?OmPT!E26g2X0r04=KM+)Op+{C^2ZD5+jU@tOG4r!c{MsGF2Yn$MH za?|+n%qv5a`2NQDERq0I;Y7^GJsHijE?&gGF%Qv6lloQ76d?v?=wi`R8u9V;YKJHR z@i3iEi?arQmNhlreiLNV66KkZp#Q=n|HqTjdKdE21xL5wj}J9%)UaixTlu{Alf%kvDT?;Ro=WeCR|R9nM+ zC2tYsH0b&>X=#tNR$YdpsHsWKq~B5=gv)7oKkewqlhhA&eE0clwrx#1#WZRgKAR_# z`|QVMyhD`4 z1sYE^tA5?`EZKZf!;A1oW7BB2M{<8O=M02D_(YO2Nn1JnumJBz&TD%}9UNXUnx7Fz zA(#!4R}iRSHH8i;Ten|v>3MSRCGw=n;zTs={CN71{YLkhf+y1fLTM6PYQOtm#425z z4mfPlT!yab^JJ&+ftV4?$x(4|ENKUGo|T177q&QGP~OF;<=LQGZ!vDAT6!;V z%KXMlM6sj(*~}W}o0a;*ikAryyRbTR*p%uoyDH1& z*)pTmF3tK-70+| zkePf%J}qcwMMt`7;lNaKWZ|k`!#whb`rEwuDthi^xAPytH=KClNFonSed$)Vs(1YI zgJ0v=Xel9sPn^=28-jX;bIa9=rUSZ$_{W#=$LzTm{pa9R;U70IIeK??|Hy9GX4kp) zr&UhT?%mTRXYWk&thgdH3zrI)+l{!?)Y>F@CnRo^>DbH|_J%AjOTZGB_1THxI7 z#q_$y=wCXqsjGV1k_WkIze>u=s}7-q^BS(QkCjJ{efmI`kG$pSAx^Qmk#V~)V=VT1 z9sj4Z@&t_*WxnZzE%F~GscC~%XGwP7go#x?Ui%`+&QA@C?q0NAy;3iR&~Yp5$y4tFgQA_DEt7>2XrVt6}OZ)zs1Nn;TC~;SXbe6+9aIdeFdb89#j^-Z60Nv@p|Y zRlCxQ%=SfVco#0)v2gmutFEea%*J~CtVz$O>HKSBbevsk6NVUzs?E79_j{keYeUg` zl*+T+=G&d^qpMpem6I1#is-GU3UVLLex0pyjcU^z@5s85AH>ya`npK^;xp@q-%@%? zd}`=sgR5(@j6z0BeJr`Xiy!&vo|tU?;G>yQ8T77Hn&hoJ+g{kU?8d~yn^VS#nQKSh zX%uhUIesfGaOQCUK8o+;sVHK@YHlYlQ0zP*sjNF~8)dMzw~tp0B*{ zJhj|FHnB~NzKBlGa;$1@|y^ZJB+@Cm2->48eS}8tS zzkaml##GRDoNA}Mp4IYcukC54<9nX3Gl64b@;;_Y1(z!2Z0fDBK62L({$f;&!KseQ z)sj(!=5Fak0}`K^p1_N!H5| z7*DI}(KH{tT1ZLA&sF*5Wj>gERgB_rMqXj-^!G>kk|&nWDow9k(csOOd_Kx;#-vo; z?!_3nM~PYVnbP=_vArtyR#*DM@^Pi<%q?Q7g%=JA>md?rV!F6mtnS`W#GgVZxokMUdXj37tKX7)Cnpti&y zLEfVgrGBK5hhNj{B1G-n?oU1lx~w$)urBLRQHw~ToTnf~a#bUttG;YJOB;cfH1+j; zb!XoS&V;o{{8}_J^I_sulyQ~(4enBR+2?}#O4IkWG8&q#61Ou1pOK1=tYX|e6#Zzi zF}PH@{tG*(_~D$j@5?98eAF7fRUm3hx~Gj%y7!WCDeSoF>Yy{ymXD3d?KZJx3U0BI zgp9p;zL$m=kG7q3EqiQlAXYuTG47&9%QkCS-)|dQk;Z#3*83WmOm{!0)SY&`qW33pk=XSgE>spl04!n|T(VHJxN1_=yQe33ACrNiB z^!={xS+ng8E@LD9wSsWb_L`neJy;}Tw&l*LTSccrxpH(*S6P;0vzJeA>Ie-a_}=vC zrb;5JWSIt^j;yZt`d7l94h{8#$&B`WmQ9sEe~g*>Q>kA5%z}f5C#pp+@xo6fq@XGDGnCsg z8ET#Q=d%IN@M#j1dao-^(wl`CD>9niPgReqxBKZ2Zu0(;ziF0i$-8s<$)HKut%8{6 z*EeQkj*c!Ynf7lrQrGyHSH&n;TB zcD$3BQ>K@q1iBlewk)@}RI2>d-XO-f&lmT&^L7wv-_=y#X1p-d{@HAwty(d>YixEr zoYTqdK2hZNYt$eARbBp24Y7ho3 zd0Q2lObyFc$-X!s%^mgTP?2RDUg%{`&9=MrgP#tb5KmLMnsw`CW>edbe*H^><4vQ{ z1MAbvhquhL>B5z3WLS z@|zm_VGd6%CvNOWUy^F^`P0D(%#cWoRqi&S7~5XSg2^K@)7g*hUWYCt*I0OeTdZGu zbUQ`x(3VujUg?P}o5PhKYmdI{4Bcc6Tkxssr~P@0T7zMuI<)@6gUIBY^{*b_6HE+{ zwCXTW1DJ{heCg ztO%=2(mXWrddZ7#E=C=;mZB|`0cW^8)=d5*0p2#PKP~SWDm_HGDt>&VTcC*Ed*`lx z&1Bv#zIKfE<;kYKn77NzJ(j$&FB*tgcL%E^>;{#u6%IIztdDUyW*4sC{Uy67)m3bLGZGBUvJr#2;dgbX!_lwWh@=wJru{^08 zn^4tewl9MJ@YU3x=FF}8#^2xfRRH&M@*CzHu0z=bC;Xy+j5?(?hVQzdTF2ry42oE&~NfW%?!F91tKCiGsJJ@aoqqER+v=sJF{mtE2i9^?} zV7`i`IP8Z#$+l+Ni!%ANV~q4+bL(XWx2LTHqi?uf>t*yxMjBJ`Jeb;*j0)GNf<3QA zn>KddOV6NwIQnJto-`gCr%5J8)4+RgRD8R~vOa2sRhUBl`02jtlKx@-4T=Zxr|{oX z;evp^{KiS0UZ0)|WdWpzvz^{L5Bk&7sv_@*n$+Oa|FEf0-go#GT-3CuejDXJa(3|W zkE-h8sp!B{56X&(mhV0rMCT0fCipz@pa^}E^Nc!iHPfPJ_<}_2n>VN0xrekej?#>@ z-`5k~5qHCs-?l_F@Kb@CwB?2KTf@VYZt@TZsYXW5O@3cb-!jnY^%I&b^%y(vFG4=eNQ897>;ZB#4;$41R2{9W;ktTy=C;) zr~#Er;idO32zQ0vJ_?p)O{-nXr+e$g#=t8UOKk-G%#&+^@rxGQ}hBawu&j_OZ;ah=qhdY!l#Z@)Py^<|&rw=3r#VYAz0g-$6;T>bjy zN2x~e)QsZ3Frz(bC3i510dHKE((fK8Js!KE@TA)=Wx{KRTG3E==EAg}x#E;D=Hz1-HSXrYd03| zW*WKw#JGoG-r0Wl+PPaiGwsgU)KvjuyUm?JB#APu`taDe;Fr3rD4WCBBNp@%@sXGI z%rqQ2L(B5ehL!)sfx3%N_wIhW{9tb5rqNC6S`xKzPphSLMftiQx@kTW<2kyz!mMkS zHvaBaTbPRd+2^b4E{3jY=+wD=@L}sV$B-S|J0BpJyDVvYkaGva!1U3_^Qth&r-0PrrgJ~;Ws5C zt%XCmuJRL>MRK*3Cmt*xOb+$3)!HSyW+W{THrSALlJV3l#sFc zPz!lS#;ES-*K$Byg8~M%6`i1R<`n_BVA`z0ot_e zfn|>{oAvfo!TD~ffv;Mr{RaCj3jWKfcxk3(uEC+383W-b3UULcy!PQ^K0TRQ^&EeE zLUwdX9IZS$s+?RIL$c&O9=%|2tT)hENc^ZeUfdke%UDC^Nqkx~Ak)_Ngw;)oho#0bJhZyy>o3Oa2jGNg4 zoAw-w7dtrB?Ua#YlzXlO+aFeAF|{<;rg?dEo26f@WrIn2#)}yDWffUjd*DYB=VzwI zWm7W>GQ~%buPU&@T-*IP)8Jm8MQy|l{aFnc1A|Es+`h_kHK`$a#|Y=)SGP8wJlm%9 z;!^%p3xO;5=y2AvDZ=wQyQtj0PeyTSA^j&DX5ZS9>Q)o?k%{YD@y8P0#3aZg+rJ(E z1Y5hpk^V>3OHy+;Ex(8-7!n@v#UvrtpAQDiculC;$VV@HmLVTipIx7pr}AQ=``{_q zec)A+e@LCOtGN|0c(X3!<-R0BMur@{_Fem_@^Qk8>}`){z20qdseb%Ut?2eSWzSVy z7w<6_m={x*E~#&mrojcahT6uGAoD-D_T+)CYb@_Bh#4HN)VeBe@> z!_7SvzrNPL3LjYM{KGDRBo!9^R(^9{RkJ>9SSHS`sZkbsda+45KDyE4a1GytC+SJq z75W%=%<8&5ZiNjPDz3|wCw^W@H1I2qxN30B-PT|&Ut zliV0wGb5$tEl$lP=^WkuVY@)lht9ksinI6HNsYq}goqRH=wneB{Lar; z&cabWFw}F#|L)V_R zD~O3eE4SB%j(-Q&!0>;z9|$j(Yt9A7Nj>}v+Vz2?>*qE+MR{bz@{ig z5KxLB*in(Dh$3AO6lo$=1O#c)d#{RgumVa|q)PA7JJPFwRHgUc%idr120R{5`JZ#& zd%xek-@DNvYb7(2$s{`~nao--FV9^4Jn=F(d}Kmo_NDr=tTgiLz9J3+AH$1e<0Onc9hkfl$GDe;>owDyg+BKwlwoOr=fgw*MFL5zjvHV^fNg zYZVR#7m6O)n!wTdi6LG%>;y_qRlbCd?^+)C^RC;KOw^Xnio3gUH-9qRGiwn) zwOdd;sh0i_|IBadg zM>8vVq99k&#qg8Cm*aHm5t125;dg9jK5gqBL}v69<`~6~A?jR7GTiu#oxRkD)rp}! zz}cPNvD4aq{RMlad}tEIz&;bp@RM6yLvno!IpK3WB5ot7 zrS2{Xv*tbXIBWc3Qw-_5PJ?NfW(^UOrPxnQ zYxx{8XL_wuUEHJJ#CU{E#v~f{NRs56hlwI3O( zK3JALtSX1Ccy8n2!c!ZhSaLhPOmBQ-`kN%1v3Kr1RV;R?w$yCRy_AFw=AUI9pXhJv zJ|~$NRXzGb>&@^z>^Bwh+L>Dm<#fYDyymLSG2S!YiMc{U!kl?=gPe*EG^3O6w;*q_ zMzgki40nklbjB-$hQqSxw;k~u`M#<*j`#G6+{tX+OVeSlb zk%ncNxym*-0vNALOU4jiDwk7XADH6(x=vS6de;5xtlJ3K$)HUs^mGb_l9&J`EsNDDEql=jp`c9eXM7owLYpYv5 z^8~)Zh`ha!r-HM=9<|D4yl&yJF=VPDQ+9x@ish(0Z+6*NJM{?vI}VCow$5wT{U^7g zEFOTA>k7~j`s zWSFX1QmH)Z@c!GR+)#6UAK{ah`=1ounJZ%SIuFvx`z%^WJ2Di+x@Vm(IV0iZFmW~w z?RXa?bKoeK2R^-hlXb%+^VK8T$qF=IRwr}UNf&ZdZ?9IDvWRR?tDo)as07Y4J=;kL zhx<8O&MIpa4f*OfjhfpfzdcWMg7dzM4)UCyA{59Tsh;T$WFgT^p{NNptL6PHvs17h zZ2em!oHC8;tMcLD<0{cM+w2d=&rYxq@I}l4XKNyc^XbG(SYMy08dfEK96aMi;LU=! zmC*>7=`1rck62W_MAn6^`0A%;Uqu;BZrp+Wzph}lH@NHcR2pS+=CD}83x~W6=BQw`&`MHWd@sugL`fkpll?sRZ!r`~pG8@@H ztloarj#X~8w1b5riew-)9yRrJ@+To}pw_oG zAz$>?w!uxCrR+?I$s2wqKVNz-!y(W{7BxS{q1pDXVM)_G@}f#)JeZyHcwKbd!yyx%W} zeeOGc7jsc-Yz1#C@9?I@!z2WNhT6{xRU{6=;pg5be;f?#w!ktdkz+1=bGcnow^i8C z@xjTfD~(FcF-Q8X&cXg&yrz9I^idiTj`}vkwW=HJ(J`&}r!O3lADneWakBEt$r12< z=OU&M8}3|F?Xi5KfX~n>8_aA*ZMJs%`q^aVD#_2@CQWjjBWFGj1S>nHD&j}%S3hni z9InvTIvwP+My9qsDkJ8YUP_>L6wbVEek$0+vHu#R49F#(ntJRn8UEFs+=DG3q zwWsPJElT2^=NXrw1#P-na??UM`X0E?p?Y#It8_rGFEo0x(lO=(4p-vX9k44A*H;t(2{wwtT>rDrGmVzlC)GOHgs4!*XiqzqG)I@wG zdgXLO=-sr=sjyf4ssXarLuTb%ju97zD5hg>6$BM`?{mv%(#J|1j$zAZ4y7)Lx!W8= zxFOA<%6Yh-1~;H!|CQC1+vB{)z2^{S&+s0$eA-^=PPJb*)$hx{+PWV3`naL}G7cKT z932Tr_!hZWXs@`8`h}I>{o+DNOn&1-B2E7)o3g|_nJY+L`4%_m@STe;cR#mpuB}fv z3*ri$&S7U|G0|%3_ldXg7F+pQ-}hlV^Wi916kh;YF@1Qg&OCixei=L;@>9ayiiu^O z6hcO7*P$tmqsv?ri*r}}+P?c{5;w#+QI_z%3g;%&=jrZjEAEqH zXLJ27?yZN@ShrdJ@%9{JaQ{po~BL;EhSb#6h`|9vPN7XZvHHB*R_StQ?6`YUT|j zX1b=Z#geg}UY-c=*4CP2OT(rz9{F;Fm4I)ll;k9?s?eda^kBGQl!2A;#24GykMQm) zw%dt~@6K^DlI9Y(()}dtmcD)*6~9L87 znf&NDICs0~JuG>CIJCa4mwC)eDhT3hXQBAn&p*5Ly<@*afKO>xZZqV0`jk%5ZV9VE(MQ7t zzPB}gwAHjb7x!xU@``iLGi@acO3~@M;3yILrr?Szhp!}npsCN&_VmZ%H~EU&3O2OET;W@2bwSDwCc|{=*FJev33M+@E?z^B@YihEMF;fc@~i67 zDl9hVd?POleBvZyg(yOb))0nq&5=5@MNZTao~&9|_htst+DB8*#&m{Ug;pSe_3;ed}}Yrkqmnw7aF659=;p5`O-pQ+Vw>UxplecvV>Z^OAEaw~c`%fd&W zjb5J3{$|#KYHg2^NfUeI(@oEQsoT6C1BrZBXZy^+d2mD0B)ZtkWqEIhaQHzuyeKJ@CA0<|5yI++6Z#%jj^KPdVv!2N=+9%a!XBk=>;X z5jxGXgLd%?t#D3s+syS{Sn2uPP4!pwpR*>Cl-uo=oPzt0S^A$d9ugZLy-?6)ZQW#t z1z;b%bS_z!W8~ExJ4J*8$Ous7=<5((*S==4Iu}@G+RsG0;cdQJWUVzCSAq595YQM| z>To;1ShH^b@(cbFGc?B54mw0E@~fVau?lzKGhUk980=$H>vzKQL%l@Ost?<>HY$Q4 z_zvjR{@G$8P}#0_u?QS+;O_QqIXw?ahnQuh*sEc5xqFyXAyf2-!defTL0){TCgkhPesVfhDd%U?!aOpbrgBKERDLYEss zi?ko@z@oJbd&mwE-eG*5#^2B)3{^qp|w^j%KR7!EV?s&$@kgiD+vA~;AKe>tqQKI^R6 z;l8PO%SP7VQ$>DZXF&Ipa|N98uQ;(Mk-V)0{DjpT2&h;?s=NbNCjG%A(XxrGit6q4 zxQ)f}i8bA8s`XbJttnHGgkNLGSXiM`DjWN~ly|=G)R-LT)QP!=p3=o@R-|7V4XGN= z22WfX%?e3vxv3R(+UdVtVu*Yfd8#U3qd2t)|FqT9aB*_mG`x-Xi=&+rft=Xd`7wjX z!`&FSVDGEsubMnyTje~MjX2}z%qqobH9yY3HmWoy*^TE@z>%>Z~~=yYZ?Lbvp+(;@6P# z54(nq%t_*6Q0ZFWF)0I6h>1q*nPbH~`*IqwW(b}65D|y9h=p*Uvph}3nY>g?gGcZY z*fHsE%W{!Zbv0$XhRO)fLHC;5RZGJAnScbxcYJGh(pKD)`@Dq@hIqM3!k0#s!A)Tap(H^ySIp6!{4l{80(=`A{)OSE?`goq zomaJCBq%5d1VjXYkdP3#ar*|idGjU^7Z(R|a&qAQ{rf;eLj%BXCIDSsU0`Bj0)li| zL9jkM2!Rl0cnO3UT>;_793af(8hB@N8AO_00UsblSzHCNR@XqR^)(P@!wulBAV{?5 z1$DLnG&t@9F*f`l$$=llIEsT5M}Bbe%|&oI_%djKUz2HcB?X;txIvn;AjojN4nYWH zJrM>uPj7&Vch=P2to1oA~3>5j?2B}Y_K!&F*$o5qLMX&CI+*g_)|Fsq< z_Pq_h2J?fGXHuZzwLGW{)dj`D2B0Lw5R``*f$A`LA7%>5!%aZtI}`Bvy&0(aU=He{ zEkSLJEoh9h0oAcipf1h<3}hICYi%gN13{o21%x2n=tO~=Ur|833k9Sg$U%_qK>^ub z6j1C#0Tl>p@Lm(%-~WaJ55A+o!vPe~8bSemc&`g%gJBdf8AJi&5fpHMu?>t($56l= zg6%j8xVpLmH#ax%?AbH$8oJ0tL_~n7s3;H{8w=9X(m-ZrCiwK}6DW>!24zt$pd#7@ zltw=Rm9dY(=eWn9{-Z0XP4)%#ss5lP@YxU0k(sj%pGXVfl83^|Iv~Dgxm;K#z8|vML`AWb#yQi zKn55NJDmx3MWwxdKtO=?Ysf?0qJi{O6xL|^9~^eoD2?e%;vu^X{zy-RDr98DFxaKv z6#=bAOlR8ZjekjRgnG)z$be>Gk%K8;XIBg8zJzH>Gy|#hosRIw^53IuAw61xE7iO7 zKkD$42yb=-_#=G{>M|p&0GdHz*k3bv@E7#BC=??TWPq-MV0FL`2Ixxs+#BWof*v1L z#*AjbfM#HeN)33m7oI=d>x~#S{ssL$R3R%Xh5=fKm)uj}lMNke>g!P%uh0_gs_`%A zaZ&ZG%q-{%U|JE~4=5-|VIU?Zx2Orn{2tJ1-0eYs)E^4P%F4=&R>AR|Zm>g73>lCf zs|mm;0Wx^_7v*C`p#&f~Muop;Knxj}=j^F5;IHUSP>yH;SeelkfD%xnYe0sn05LHc zYPTI!BL1rX=%IYBVk*FjRsmGv?-&%m+GUXQSM*SU+>ilm1Pnc7K(#9YtN<~j*LnEx zp^EN~_+UqWCw>l(F#^CE>~*8x7?5J<(F{^|$H70LKk*Ue#f@nL41=9U*wMjG`A~wl zyT$L8|N9{T*9=wS;UIzz!oq_5FkJc33kt&mf`Y=*_sIX09t(@mBo{r>)t8i%6qXbg z7AEYdfDFoy83A)m_J++r_MacJ;GzjLCqRGm2^0Q?9v>CU!or04 zG43@21?j(_$3?}lu=2;bqIefy-+NnbEpUVGp^Z#~@ zO1O%l$28-P4yaIhe^&qBXnwwmuIFYI@NwDsDect24rTUd^ysud1|yUw?8s;xVtO)c z1kQRC=6Ugt^pAy`i%Pf&8SM0A1_mZ)6iOdc%s->Y!ha9@P?E2ktFx2q)0iX_Do<}m z%6~`?JECz^&E7M&=Dh*lZYBRQJsKYu7a#L~mlhrUf&Qn)hnN2`{7V0GtDQLUpBel; z{eLX}kMjR#lHXzcTK?}c|G~}w(*J|;>u>bWmU&UeDU zAg4pqbKSnpb@a&-_%-x@PmeC^|0(^i^6$y<|Hl|TFe9;chUYoJhq)*QB$(J4;Qua$ zhoEBa|3mx@>X9BII>Q)$4*r1w@k@-gd;e<;cGLf>@vr>$?td+RPcD+(^8T-lF%9-N ze;8routHFS@WW30(|4ACwiENp^8zjdE+7Dp&$}*k9b+$st63l`D~quctE;R3uoIiY zBbO{JEP$hYDHUk-I}H+@Z~d?#r$HO?&vxXjr=sA~4?FTL zkng=?Lr(X&12Vi7K*2M4kmmmo6ug19;urFu`@J|Q4txkI-#h?SAzI*bm<}inHv?6X z7N9!P6qH5ULVGcM1veJjjN|PAS1S_QijmM(j06H-kU*#d3B(}W=tP2>5X8HXKpMiG z9wf9CBf-6HBv65%*oOql5FSBL`G$n{VkFQUKmr4dtr*6`NMHtS$R?vmU=Pzx$B@uY zj08>)&^BUkZ*KrU%m4xd13_qLD0u$vImTZ6;ll@vy*N2J8KkDBg1o#uP@Cih+R{Bi zd!{#NO7j8j+5Vs^=^6N({0!8jJ_mJa&%u|R*WgQ0Bxo;1+k}%qUtJdX_BkHRv?hRW zwW;8HeFhk4%mE|NF6;&E!jC7Az#H0xeaDgD`6Lp&g7A6@3BtyqEqEFU!e^1-9mGM~ zgX7?RB7~F~B*=y~;uy4D7(xQH=@!l-L3MRCsBhe{3-|W+g7L3qV65vinC`0sehL-+U`FFY=Zp|%@ z(;ReYtsX*)lw*uQ;1T>S{v{q!4!S*&{u4f;<~C<$jS~kNA6>$)_`m6AS5KujoN+Zy zr!hT)=Fq7c{ol*;lYVye6ybT5UliRl&>~U0ltP{So%{%*8c!kE(9pC79S%4nmwir%-_Gn-&4t+Fgw!y;D78t1tx*B7X&VxXJXpnec-t?m>Bxt{4R!BnEQVl|H^0Yey<$-UB3SV;+>@`MxU5z=iWVf zoyq`#AHt7yD*T4@j{xh8S*yZGKu`b(3kzd>nBc4`>~H<>RT7I5!>lu#J!nCz&q>h!`qGcJX6EDH{FSoZZ|(Xk-Gu&1 zw?NVpX^`ck_+wpJ@m2%+AZdfr5PeYk&I;pS#EteZ`ho(&9VobFL;(@Bj}Zj4kC8M4 zc?fr)Ptl%_kuvl#(uH8$5B-hcIuY$-qzQeD_I!&>VVXHiL;Dxm!gL$xql5M@^78Tm zZ{NPf_!6Plg=k-*ngn-Ho!|k!<_Ca|{I{T^AOv((d<5N<3843LB4}&K2ZQygV6gcU z7=}JUkD5?fsh5)ba8WVjRzqWuII{1ia}#*1!(SoYq~FA zKv&mSFxXZK*L4+OqPrSQ^wfeWxTc#LXa{wpBcS8^ASjzzgs=ok=QltxTo=}^pg`U7 zHfVxAKmE|x=ll2XV03g8OiX_RGgBjAeqsPDO%He+0gX7Xg zc0PX9KSyxm<+%nC?CjaS|Fj4 zbj5@OA;vXyAs5xqGT`p*Nl3_(k-~g2QPDjFcI%(>^;yWsNEF2|2v7Ov00#DoyRLR9p+=8pVupB089PRxv_ z(IQ|F2w=V#TE{==v2b(@(2f-H^5@YUp4ix!!|b2((TaL}5?uoHdmwxYcM<<2pV3Gb z76B{a`CI-@`Ix^>jD~kHwLI(aTmD`Pz*tI&=_I-m=S*+^Sw1$lxc*~PBh$xv_z?Nm z@_*T6#NNx_Egw=~Fn*xz<^L#ucdfN^kNqou^nN%x{Fqe#o*t8hCWQzXlt0k_D0t@r z8}q!~(?6Q=@54?$bT#>tKub$ce-yLh^Cy{@q`iD}8~xVnS8V|8*Uj$KpvC(b z`0|n!bOc_7c5zXV?t=EK{=IK?j{8lJ?I{WJJ#T^nzdIo3nJUPCp$t-e)IjDl4UqE^ z`cwz%f{Hilp!S2wj%~Yr$F_~0qulxm?b;Cb?AmhBuC26d$5w}SY^^~goRjR>uuVpg za4rIE*>E1>>FEi4pZkD-&Rw3v`#@;74uTL0^WQ^=hPLZuXrE4%m z+LkMeK~rM`Xm73sEzM0}yr%{fkB);XXm@Uaw&oUScm4w7E@*Qen4AXlbF*L`+KLz9 zoC9qu{_pM=47=|ChW`&W00)X+xI0=~J39T627r?m=S6mQLC0S+EV;NiE+-|jrQ6-RYtF~Rt)-)-^XL(p)qZ?*5V}iFsw%+8gC@DiE(i<9N81n(V&}=p zRjvyN@bFyY;^epp33k#=Po5-a(bszL-~k^uB!Lr+opj?%87$GN^K}2->Iv@IUKzsz|DI%;We^**cf{NsTxS=6@ zL1dRdS|;UFXV4TpzO)&d)g6MJ^c_BsnGxIBlT_r)CWzg1G!JyZ7g3Uv zQxe_3n~sqOdnaq>?=F9gJbz68Ipt^kf0=&x=Riq$n3nD+v=98-fZC!5s5z3~z!~e; zXWH&PIvov&e+1~hi3ap@j1&R`guUk&y!b8r*>g-#0HF7S6%`c$ban>(#{2+U5`m?q zC2(+X0B`l!G4Blp8(hZh{YG1IfoLmk%wBK24bSfTL425f-emaPN^ukb4bH?r*4F7R zf|z%JvOFX}8hqF1(+dqy@YWFXEGmBo_h6&pzH5RLxB=J8=y!5NA)w#KL9dhL;JY_U zaDA-Y57)*J3?ZP`$?Ci7Wc2$trtlenUK=~X_i^0Z+(6KCPw?iIKX~=x83+gn0HGnl zATjYZc>gXOWPW@L&vy$1St+kTW8!1bp8Fa!We0(#f++BzrUE3k)PacJ0q_{|dO5KL zBF9(Z^91g1!u4mUcNXItTVwhcZr7U6mny(Zm6{yIMVruP56`d95{S((UIM_ z$j%D=j3qGlJhYTY`T4npSsBGK_m_{+9wtRUNm%ay9Jo}$=M^|{oc;ij)GdI?hb#n7 zkR3R14K7g7`7j8bq&>_)fWF@up7E}7a_&d$JAh-P^WOj*X8+$fKi8bLqF}b@l&_^&+QXXx7xG2f12i5}`jn^z z;MA#~DfzU2zaDlE(;32iJNi%66*k{PYmZ&~#4n-oXj-~5-> zPYKamD?NRbpKqV*=cmabVK1N7x=!E=kiH~g2d<0{j=RkOfe=P+V@*n1rFdV>zAM~b z=V$uk>NJSf%Dv>ahTO`i!c)Q(BilV)O*calv$%g z+QA(9bT%>A7e9IChNjI(TVYzr_mYo!^92^^^WQaFv8ONkf_=yN`^JuxwV?8Z->fe9 z68cW^&ea^WpL=yW-%8-b(fr&af&F<1F!$|Cul20!4eopkK$35IvI+SDi&W@2D{qO( zdcn08SEsoNLm=vnTClUaB0+5GM&!)kweKqqcyihip23GB-SP~gAAAl!H~e&)#E4Eb z{D6l`NdyCe!Q;5VVbt*IOfiIgUvL=l_(^Z}eUbGyN(_yv?{B;28@!a6nqZl9ue{sJb~_Q zpTWNOPmaNsAbSd1?G_cL3;vcEJ(i5nS<}4!E|2t_IWdqH_38tn3^)gmniKq$a&9*_ zVw0XZ3ccRceBMPz;|&iF``I^Ked_LRpzA4wt*N;(2tDNvojZ4~CA_w#M(W-@Lf~;D zQuHL5N7Wz|9i1@K;j+$7g?;xfeu8odKB)Ae4&rm-g>A#8*UnTIa+SO_TD+_+PNqcR zL9}I6Wu@`bm^3Z7H7WeoZdn+QU5dpd=9JfFoeTztbC(_hp$68Vl-s1p0mGvv60VTJKW*$y==n^YAlO{)ZqD{ z=b|_<;f`DlJgdqH%Ad$&Vk9n@2d16YRO8{{S(|g`^XcnT;ocaF>`ZxpfCmoU8Jlq< zpa$Q)S5_?ZXB}qCCcb=ZZfm(-@c_m zGs@Xos6FWUq$tlATtC4kR5b{k-!)SK2Hp}j8t=%gbFS=_;J{t^fXMgxL>6BT#eO76 zHiGSF ze{XY(ql@MdYhoeI#o$TfmJF^-l5q{WDCkGFR!UjuEc;RJyWh2$;?JK&+bs?e!fL%h zC&80tGwajs+|2y$ySvYixCrR;S<_x4Iq*Od#fm3V_0l$ru!Gs!MDZ|R#sEJ4)2d3g zOI&{2BJOT!Jz2^!2TN|YPBdLDz#`;&o05=zD71CE*VGZYJ{p;xPOiE&K-t{gJ-Ir0 z_8jc%_>?Nv$J&!sXY~q^pXaWGb@#c88_|{YuO6*v5~T%_dRNjzB$~YXYwmjX8{+tJ zvCE#XAUWXUQfUB(YJ=&Ms(nfjUoPidO_)aY;k z4l#2X5^REa{GAGE5BH?VkNvQ5s*h4lDM_AMV^3hN%o-S+kM%~@=?X0lk% zsR7TlN*eY)$PSK+o0(lS%$vU4p{8o@s!=wg!o9X-2$xwRT2jmhY9Els42&g_@dZB7 z+YIlHKP*DIB7?K(Avopx$b5b)Yug%GzkS6>8Xq}cP}|h5ptr^RNKbG6OS0o3&OYlC z2WYRTG2QcdRcU|VyC*yXxq6wPkaLB;3bi(Vdh1(b_r-zHv^9=_SLG~+Qtr7iI*#Xu zcZ+pZ7+s{ZV=6f;Pul&m3;Rl#y#Y(oHeXTMtcrE*ngigMks(JPqZ|<*Uz4ey3deMi z@)QXV`3+00Gvb^ryFilf!?PWC#3Cp5%|kDTt;EAcb7H3?9F{^e1ZIAV!ZzX%hK5Dpt%bCfY^jSx3tFs{cHM&W| zMMXt482uvJ(^R(bOl*DDY6k+{HwVsoNN-g(dw;1+4)1>IRA6^Peg4V(HKjbu3vvkx z513^1;g2PV$1ZDngz8P8C0zwccxTe#7>3iD<*F8KmP{YZXHN};A1vY-AerYI9)J31 zNu52VD8JA99z1E;;-qn_IHx9ug%Ts|g39L2!d>~zoj5aF+j7QHSMHaG-<0;^la-IA zrPYo1C<+`etkZQVU~V0&s4u>ZbYLk=|9&b6JyvvO>iKGVdA<+FrOFv7&t1vwjNLS& zlS@>Jsz=p(+nGGHRz4)evZM!Q+>Y4gBdg93YjSguB65)@cs-XH8DOeF#jt^_*7&jAzTusKM6VDVi z_Unbe&7~vw^Fx#PFI=<4NTfnve(X-G@v?biF?7()AcEOfg&}dYqquOs$t)*%vmiF{ z4$1Ppd-qZweL1J!lOz2`_4YHYS65;h_+*2#qgJnM;LG?o4^Rtys0df&{ZxQ8*%9is zQb}`<&P*x#TMurlNrhr)&i1>&lv$lN-lc|7^Kfq$PlKtZ7}IS0qaY@`AMg3)B8PL2eH zrPf^{&{@Gk67C{Oo#NOV7aMQP+anX5nngC*AISY^R1`kW zTQzq4+vFkSQd%E0tjEZCKctlU# z_HsNN@jVcEw4Hw~at6MayVNOEY8f^~D#V`2K7gXSBdv1UL+P+nn%4YS*oNvc(aq-j zmk4Zf=$n=aT3W&i2ge@C^BsiW>`;88a+{(6D@Eaf%5mulp9(TBvxOn;2c7w-&V5P~ z+dNu&PLIw>@y<$QYLTmIeYKW2ARQ|q(@Y(--R61?C#gW;tm5+g!R_v+cZ|-S(;B0Q zcoLV?PRO||C6TSO9v$lLkiEI(S7=VBdq+e!bPbVLg70VGd^d0geyMM}eW6M8c3!BP zE#d|JXK;(E^)X*a37bXnR5r_WMN_OJukuK7Dr1;^qWm$5R`c+IePJ=We4o{?Ve!9P4KZ#&Rmo}H+|m$&?$ux>Ce=4j`CV}5B8e{NCRa=_Z0 zNl}R=hS1=ve~P6*SH|HM^KcaY3kgF=f5H)4%b`kSzL(Fi#0oh_b6k^Xf5UT8}_wm$y-iuMY3@8~EVeW!Q@TZnw-EZO|3 zg&q58P70ipM6qzlQ#-xCimjy)i5K1zvl+52M;-L&NE_Z|^lWY^_Q|9|Km|$E+T+|3 z5hk7F8x&4S2c5$4E_=dUpS1$sKH3W;19Fvnz)$F=iiQL5@{Uz=D21J+-hgxg;vp_nK@XPLtI@^kROosHh@E%m?mc5!b=ENse%i?F2z2&n zvH&kbHa2XRmX;zuek6q70MgOZyDlb17%dU%1!rEbUTcod*UOwUslVF0B2@KU(Sgxi zKc~`47pc2HIg)i-ZwKspH5b8ZXfvJ zZVh8&(mc!Q(v|7%=8lfhkIXF3ux<;E)Car6xhQ>YAWPNO`r`FZ(;0C|1oXUCD&Lkz zO5ro}h@{ciN$D+{T$N*L@Zl_d@1A#b^yv`umYZ4mg@wHOT^aiuxfgG%B_BV72s+u; z-mX5~m1(`2*YEo^U7IrZ8t(DDBlc|r?sv8nRg<6LE5T7&tDYtSo`{~Dzd&$Vzw?<{ z=tCgf@an9L@$hST_1;{ImjnARJ~$r6JEWb<^3o_*XtK}r2}f4B?413^p)>i4iX7zc!-}Qr4!>x6|riVB6?xN zqn$-B9CZzKceE~doVSbv8J7_>tr^^4@GL5no#ZBb7Keo=ou$%)kcotF9} z9aWqD0cFgzl=HPBVlUTTx0)1|&rW6M6Z>sMohal(T=e9_S-Zlzz)iY+M9S{66v{CB zU0vQs?2yl<#O$d`@z5GC`mhrN-r;k~I_I&3!m%r}fH=L?5n}s5Gvr~7DM`Z% zO|PAWi(@2EuRgAk5cv!Q;Hy+hUY>bXK0CazR(C+pD*)ftfjc|!<)pkHv*{()%(W=l z$Cpy1zGuyz*e0Jv9B?A^pzar=!ZIcq?O84`cnEN{dR;Bn#&qd90&Ehk0B8RqcGgU` z%JpH2n3EF^-|A&3$6jcf9E{2uYME#jp23SgQoyftpuAY{#94D@58f~ScWL~wxBGDi z@Wl^hVj1%g!^bg$cMR-;X6;96xw9kbRktd%h)#zWsNVH2Bda);aDuSK(VV2I_|kxR zP;erPB8@^}d86!ryuAbwLIjCm#;URiSzHY!c!ovckz2!MKkmwM>`pXES$^6mRpH8< zp2wM?P$^Oir7aqhTOyfDEa6z`5$}iHtR3XhntR_=(I^!Y6)=eJ?Bd>Y4uv_Qtl6S-#7z$pix=rOv&@LP3Ryz{& z5&IPAK8iR}9AohYs!2_{`?zw}H+BQ0kn5lxiBWaF>G@intL)V&-u+_5w@*pTHZR;& ziY5`D3UcUPG*Bxko9_1(-+IP-q)zSIXo^wnr%wn_*wwLLIKR zyX(InenSzpcC7s!(dYdYL<5|{wcg{)_bWJiW5_R0=_+rjR}=*=T`a_>`l|nE?j(?p zW%ojIIalJ-5caz9E2gUB9+p&1sOMv4^>V*FoyEK67ZAgzRUS#|#MtT}Xi%}fk)-}+ zW-x2oD(g%TmU2tE1s*5h5ECcvC;Ap+dfXQ*)XB=<*Q`S&$5;`tG~ON{yWpOq-7uTt&y&Sf6>uKKCHhb{C zE-7u+tit8j&jWk8tm4*Oh!`Xj6jDorP}!l|k4#QGX&+&&lRu;$_kR$`r?OF;CZWMRO|$ z^^SEozqt|ee(l%=d@@!U&sKw_<15_8h?lo(+ga)_KNN8AH8*lpC$e?P-B0JmE~sSt zm{^OHZ_M&#)7Oy2+%|l6XKqqYA!v??te?Hc>s9tRj!vZKP3Sd!t}j^{_y;dY%4@Qm z34VM|Et(?c=GK4~j-FalB&A6$Hq}aa+c}!V@FbqRNUV5DC`aYky~9@GBEmvkPb)3Un5FFargXiE zUNVcToVnmAI%%vnMVy@!L+pG5*c8`;teI=f)2~!2!W}ZWgPq?vm?gPR8@{*-i#*hjDhPHUvYv9uEtDV@=yKfIVNW`FPc#AYFCx{Zm)2=xjbd zhtOKtrn8*4^9(qVo=jEF_cdm7i%Nm{)oZqdtM_d!l=MlSU70z))MjaHp=5g^Kgi{s z&-x`b8s~LD%|F)G(Gi&`i_*#J-IgvV_Z*7(7CHPZKyqoEw-GPkgq}pWyDo7{WOrnv z4JD&;OUw4*jhV}~q?6SBGg`TXi^fh2D01Xy5&KJPYL8Pf?GBYv;nt53?nI1 zM|p{F>(@$)WI#oHA=}E;9D~Z^&O{96 z+|+{yon|bimEumYPmd~HdyMK;u)g36YHx@6)B@jD-}xAO12 zr#&>)H^I^LKBf;^2l?5Yo5rW6E{zoR@|~QD`YKX8?b^r`^Zm~D_?IXy3Ij#&v@62% zqlRkh4i55`ZL;zMN9gbQzP&Y`W3zRTfi2>2tn^kKJNF{>+r}hKhD<&zpIHur2HFN2 z9%}y2&|h0;kt`$j9R&$wQ`5@yA`S@!9Mjsn^fa z_9-GJ;yGr2md0g5C>TlP*7W@jNu5E(N}fUcaW33_&%L||ZijNo2BT*nop zz#2H$}Rcj2YZOWon&_=HQ{hBkzUoY zIfr<$#)Df&`&!KPcM$=Pt~bUmBr?fl%ln6VKW~S7_0bH@`*T=(oXAi5EWGsL{CTl)Gv$f-l=_To??@lw{Q+! zu=0{2vxw*5M6`OeJ}}HG#8FdIWRHp_n{1dUS*E-oET)l|4xr4l4Rz~z1ikPv5G$)| zD9D*XKWo;l%$zssDztDx z{h7n;y{ln|?yuE#Md>`F_qh7?`(XR_R`aM!bD$cJM!$Cx55XlL{_sc#HooOZ2NF$O zYJLx)NG<#%pI2WiV#u68tHZ(p#(cGf&=@gG@iP5x zf7NHa@b*o+?aF3hEq5}p3t`<}Ecf#W>Sf|N?!5$+{TauH2D@LFHJv{A)P>$9zQvxP zjqwKkGUFx_wa2;odYvUs?5Jaiea{u@?1w(aF?D!f^cd&mJLuFY?na0T%}YU`EWdn> zy(8{FPsO^xMCyPYM8#@ol!N1dv#ca}0J~mk?C9o{K;J`fjGbHGp7}_0yIfqwn_=_t z`_qm_a|fX%O=a2dfc<)xnUq{K)h)k*N5Y@UaS!u8d)#!t{rn1lcwCriug(Q=S0V-> zJiNM6ow#Jz>mgTfuMS&2_E+XJo(R#+nVv`w9T;U(n|n9(#n|nn$BEbu+bs|2*CVGN z@lD$)$0Xn})1H8JDCAv?3TmBrc_4JzT=jH6ikSEP+Hfd&kdnM-ce0|}Bb&}}Dr~>) z&$d8IfQ?Sp?NWARR7Xa_#JmP+yoG6xpNC$`3L|VdT3-D^YK=$tPt{P9HtKMGQlm_G zeP))bT9Y~H43&%Y7U@ddZ5y@$R0T<*kl15$oSQ-}k^SlKM{rLtxkOLQpSU6WHn_>c zK)1!z^TgfT?u6TCIyLWARHSND`MB`oMI<(pDY6w5PL@`rr>2SIu7*~*Xz(%TuU)0Y zDZZ#%)5sc_>e+tMF)&MC*Z3?#_#SCZ&a&bc`qCv8mN7o`0L|&hENP2d=r&@*G`PtV@y+Af639$)Bteabwy=9D!_sUg|IaZCiifLZ7 znZ5UQns&o~7QC0F&OX8IN*bU*5~3S7%pj~!&PbtoSJx{yGZJ5RbHEbB&RA}mTEPci zT|?+K-*vO@iFf2qmpRv{DjGHCyM3R!e4kkCJGT4`@wjLqE7c{kGu7gK{RHDj(nR|< ziz9uLT~>!;Z)6m1Cfq##5$~M#Cx;RvDN@#leU6(38px1#Tj|BHa{486)p+06gk8;D zjC9)~oRr`4RS(}|7e6J%ruyczLC%cMc$Qz5Lm;mk-B{~#vMp~9GXgKgjfml4pY7xY z$R^-ytk0_lOktuZfyJx6XK3n9)sApoqjG3zwZwB*ufntUY8Q`qY9UA-8z087$rL5q z2%FI-wbz`0l-+K1hNA)JRUlhkaC0oh{IJR~=%*EdK0nt9PoR9|=i&}|{2rLO}AP46va9hqqUa{o+0Ze6uED4;rN4&UfaF$kU)PgF3! zLk^_34rfKEPB=Bw<^%;QdR_~_o!2JlxWYWPlf!#S7SC_~i^Rlx3?Ki8$Fb?m~FPTI|jCmKH3N7232 zCNrp2Kl{Zvyc?B1+!!2Z?c}m~L<_;6sxc`vDIdYrOoL0{zdW`PIguU|-PNF6FFIk? z%kF$rYi3B-*$}UW@LrZa+ep#ihYxEnuDQ!?Df_IQFJ~cE-R5pIveYX`*O+%m>JH#p z@CzRIx2?LIpmC2y)?chp?`>zmvHs?O(-(aBRdan_UDiCMOoclqkDis57~r6{>85=% zpH&#i=k<^CrqW1n^&E2qI$_6!QR_Jty-tkQSL4s}>iPRgy*k)3w3XnOwxG?}B4t;r35b0%YNy-J_3D zC2EWVocr3QMgLEGUjkRt_C0>?ZB&t2hLqWRQMXKGEMAY5&(cx0@>!9^QN3-~a7Ct25kl_Fik9wbx#I@3ro97K5mhESQPJB8F~1?b06tvbK7;@st|i}`1}cZ&UvdM^^+2h^^*Je{{D1>r&FL~ zHQGucXPj%y&C$jEd{0iCGQhT5#3woD@cf?hy^UaTtwV7z|*6r}}~;bv;X zL=I&7AD`USb!>FM<@ci1LWR0*xG$}Be@&`+e-oos+B|OgeY5+r`CiM&yOJ(;d*T zFDTXInpH%{cq-5o5EHH1qkP$7WZQ(l6aGH+rV2@ssdB zrq}!0-?{^%upf&0ukAYS^6c>SJHwh)h1rt?eLG$D>pT6OjOR!`?esSvhI>$1Lx${O zxGM9mS)oS403tdg2%#-SI!&pE~D3lxZ*WE zCzwYMDY&P#Qwr%F*O~3x_sV6la2JW8_O~jk0=+J%DD4)LhGEnPBQmZeyKH$EEHJ{h z4f?y=t6elMUbU*|$;@*Dw#*r# zWl(AU}W<(r4+3e7T?9Qvfhz7}7t>2=}Y{GKD3L#gD6wZl3{j$Jk^b>ZSondfya zZYg(F*1h`r_|zeR@$NPb*#`qg{2d01N>`W`VYU>cL{u^sw}hlt~?)V zt>H7FTUk}&l))1d7#w4(^>-8MyE^hx*4;&kSKr0&_uO~UD=0Ou@N&JHWQBd#=_U5T ze!F|jn>K2@`K6N&_dWc&{%jAGtW;i}!*?l=nL6p6f4;Ybv1XA%93>KU=KSrgiATrW zI52MQ9Wj^6XY)aZ%%e(8u50Qgy|uNNX`5Xt#`IVAo-nJ#K+A37?qFHNkCOV&8;(+C zO4nE|_^y{GnDFSBIO`t0q>rz=OcRdrr=TF@>WEVd6;=kr{9NA}1T`9r_D zWaq1dgJf}t<35Gjs?upDCWBzCzfkw`O)n!0o!(E5Kiz&kct)RI5;5gLj+r5ap03U+ z8J`sIM+Z7CEvbmncorqyv0mobxV6FEtyicXE$|$1=uM}D=@vV*sVPUo`W|%Ds~r|n zxF_K4MT>FcwVn%)G!T4nT{37=!gamJ#}(OCte6LK{?vrdXNOk9eEz1(mq!m z47I`|_qu5JJcM@}_*TC@r$iyF|XZ=PA^YZTbb%BRvoPuyH7!kDZxTYG0%av0lj-RLww-?K^1KGV|r_^fKDwRY=4`*nw1 zjl3qj^!FJuuHW6w_WJE|RjAV84h9r;0hYntF>F)Gi=g1nLGs)AE+x2KP8PhfeaPS( zQ?L4q>36&G4ecyp{F0ItDl48`HE7mDftvTBiF=PqF|R&N7J&iwjfPAEIR}Gb%gWUU zxViJ!2)ECn%G$*oIzLTmH=}D$uM6#BGKN!67_5lJ;~lcph8@6$`)!=q_yhfxc~E-M z616%phf3uIv-LJ&nhOonxCawo1e-lw$8(nN-SO z7GZe2Z+^LrY3FkX{U&CmKkT)!|D;uvLHsg1Mt(GCcHT zPHMB&DdV@LUKh?#4$SJD>9;fFT{Ki36;myXr+<3d;nR?N-PV12!D17BTNttTl8zEj z5jLEAMP{6gQv`kH7;MmVk*XYJp|r%sPw~x>M`0oN{avq5 z95=h09qbVy&DN(DQ+1M0wv8tRV^VQ*i!uLwDC%PKSU{=XKKA%7^gnq?98d7 zsykhma=R|E@r?5P%4+#;_r@+dymj|rxlPnS3FG?{4zw3jV0Y;llOe&DzhYM+&WuwD ze=1nR+&UwP4R)=IJIQKKr49l8q@TDj=3rQ1ZgfVm3>)+LVB-|_x(vewxF0V)RKidyp7t@izBljeJ6g4(wjSn5`)CD(#pf$sO!mE=`S7X4wA`(Z<9m5nS41)fP7SLyy_)b) zD%7-lMW4iw7j?*1Z%Ko+_BX0`eX{IwRLAYQS6}K<&@I6l2dnMx-jj10(34(ofB5|$ z%CFP|I%n38Ic5+`dFq5KrOlk+DN&+Y>B3(V9&p#qw~)Q1pKDHht~TX#t^T(4CdXi( z!uhV-3#1gN$%MJ(dg{5ECKK9!a%Ap*pfW`F+-dXpA}_(M;Zef28JRK}XB}hQZr{jG zm~|`aT$KIu-owR~QBhMDp5J44H<(?MmgKj50dszzR~y7CdS)_htMv_w7Ks}O34L5A zDN#DA$C|<=S&S8QF8v`)OVE;V^$t$M|K#&v;4+ta4>2eiV9_zT32B$cz5o+oKy;9oc>#Xri(ZjI4V$zuGC~+$1m{^_=NX@_($I>H@Tsd)CZa-`SB_vU2zkGPrZg!^0 z_4tvK0(&f-(66(FV1bJ$bTehHNkzKE97Dn$6wJlq$T(>K) zE46jE@}J2Gb8>baNcNi;&pvR5eR(J2?A-(rafO(yh#URg#n_>Dl)Oc97f};RHr;18 z)Uu5u7_0ltn6r5QvsACi>1X%OPS{+=cziNd&oms>d8Cpd3AfqIUA=}y7;{F$mdfTpYW2!w(n`Y_+Ifs zMf5XJEHqLDLbkdzB$NnOkjIBG1?dMbvl2(?BYYA z+_^CePdtCpXFT{qc1rr>vT!gH-Xz|d6KIczL9`lu34s`Om$?&oin0jT9TtxfoAcF<%=Q%Rc zKCqu@pY^*{r&#v(TJK0R3FCVz^B1BoTC#1@qz<_q7M|}W?#a)(+(RNqz^hbfX{}rN zI_0zC)5R7S?DAx`d-2KtbYa>4w1qq01)DSa4}WrRlFYba4|P^aZ%okZz^pcl$*5P+ z(ZdW4Y?I6)uUl5DZYr7C_b^qqjxso8nd-vdN#xjv5sHPb1w%%!O#0+%mvnKPYsaW9 z9SZ9#lRlkSD%|2eW7NVO_DK=2@lH{@_Q#nW-6EBs4c$qF2pPJ}HSP4F58Io%dQg7! z!lI;nK5%)|QY1BML*N;IE?x5s4Q4WFUo`@$u{ z4ubt;^fy!rhfliWY?;3M?yA60_`qv6*z0#NRATR^X3uOGwz0DRT~>y8t_dYK$aPY* zgm#3mzZzsCB66j#T9`y6lUhQJWrW|`I$-2r*Ee0yOf_1vc@kCpZmN*sgeR6m*jALj ziI=3<4YKz*5#K)ZqPo}fb##1P(-u{900qXGDFd(p7?d>phcuaU__zOu_!lVvQvhFp zCjiv|-1Ht!QUG9=3t|ZHb@0f)oxoP`16n2l+yeNKR1Xhd22g4x+kgFSz#SJrhFvc> z3HF5|uy+-KeXxj8HX#}rguvclWKtUE+!XG?URVUytRXcG+_&iCKKM_s#_+Evng>C^ zIRLRQ1G-^rN4ft0h_>1G4~T0w1O~%7SX6EKCF*XaZl7D+z%;*$C`` zNAm>sx8tT;|3mawz`k$<_U|K$a|l@oJb;*Dq78tuFdKM)vVipgWdZBMWRL^@w_H*Q zxd$x*$^!DGno|!d{}<>73Ph2L=(8o&|O<0HDj z3mt$3AQRe9H(=d9G8^gz+6l0?WJ~D-+>8N$ow*3_szJYN@Md>=^)3~(i*W|+@(BxNvsi`SRPfw@OhP^!r?2$@fFIf`c zG>*VNw&bMU7y^5$64+Cez?zA~26UPg@Bw+il?AL1KdKwCokUv!+XK`Kvq3JZ{?M7@X8`IU_Nk8o8Oczt}E}y`9D%+HnXTus<|`_29?_R}}(l?~o9v2Pg-@Cvzx( z`@GZn!+zD|%BHF0(uOI(167&_p^b9D%LCXWomAGiIwBX-GGe*_K+v1O25x;G{~XR!+#}TQcvNU=Cu9$Gqw-D3;PxkSdWt2 z-Zqow!L`lPKn^%O2uC?+;=$MLVj$W_G!Hm7GV;LN<}(jqy*J{1xe9D2t1D{47 z97j2@96^q(_$&il9z^=FNha75ynTq4?8bc@vlP)g`n%}AcoFsyhLnC~J1qk@x2iYs z0NVsE4_a*(p)PRy3EaMtk1a zQCdX2pzUbOZp;B0X-r>jiSeuGhkfWtRaF(Kt*#`|`*nZ^Gs!I;9(-@R$lF)K{-W&9)K>O<=_X}MJ^9GZ36P3^)`W*{+8^Pz^BvIY~Cv3>w4Ze)Qa5PZ%SHg z7kS$Rr2jPNw*z29a^WQOEt0C5Xh-X}e@nFEz1HOauhP$bZ~5}&1h(HI`T6;@Z9p@m z@n2m{HThUp!~xJ>uy^8@P*O;Wb05* zMtHZ`U*xt4IEKjEE`E3ih7Y7){ry#@sgPd{Q#Gd2xE5#LC%4c>2K(qk@#n#b2dCGy z*FMe+Q-L-#yKzH9Bm_Ff4Q~3Qd|AS>tG+$e)>qTtur<@{-2>A`w7@K zV|tq%N0Lvkq5Df*eb`c8i942zV~AlJXOhP^juEsWFzwp4>nqyvTm2i`KdubHs;ML) zA%Vsp|JBu0k+S?W=r`OV&tn3~vxpPq$@POI?b?32UC4?)O zIdOM)Z;|$YJN;Zfz#gt7C@6@erKORNAHgZ)8wu7sC5efNWdHvC1m%dEPfN#t^Y?EF zU%Ur9Xc4p#TLSD?wDw+0_kWiDzuNYJdu{ipxFt^Xf5Q{;aMlGY28r$?1Z#^Lca-pTGA>1(`)=MUC0ND^C=2Bhm-`tN^< zcEq(g{YZCSxGfEMp5)q&ypGvJ1D^k1qrdt0`v0B&pOyb_$;W@c|HpyMIAR9KB)&5I|M|#hyyhOM#_Qj8 zS!U1q{tQG(hc*qkB ztk?rE4S??-MDwen0iR9)z5osAmz@bdN8#Xez zM*qMKz@t4tD&pn`{*$_Z88_a#dE7n5)vbnj#Ej2VR7U>*%3l--xbOS`xZ6U!AjZ#Q z%rwT0bK|8kW*pa#z&P=#a6TiQ6CZe+;|mL4ib#Bs;op1#<-ZODpEcc_&#~Va^URI= z#2KW#R2ZZ0Aw4;ImT~e%r3_9bK@>BhM&8R z!2&qP7(_(b2@H=jV+7$;58cYYc8#&ctCb#pke*BCdU1$cAUAuxmc zRzM@l6ULV|#$5kx_yej;faw5h0d@f#1R%Qre{LK(#t!3p0^IlyZu~fY3+}oa7$b^x zyRZh|Cb5_Wz!rcN0MftXGeEur08#+HN_#;+a((wP4xAeckMa})dK3M&pM#qNLUto$ z!4dX#Zz2g6J(MSm zW!DE9baUFS+xRU|rgY&O#bU%dC+Re&0r6h6Xi^K;I7R;*X^8^>ozy$7~2PBfL!=CkU$E*Y^M=_h!Kiy zX`HsTd#b9cXlz16zR?e>~^<@Z;J5 zKU%k^11+C8bz>i|4E+`UdwP1(_}@9W^mE(}#IJE1F$Rwti(2^n;a4)m#UGDj|efT7>~)(Nw`kKXT6HP#Z5HOv3Fm_8=c=~K%$|JwpO<@Ic-4L&*HDEt4rhm z%pdEy~?bQ103-53jsv0oVT^O*)t3}{|)QB%9Y z+ivdzd$2Ldw}t;$>#^Sz+qLrQO31E(q+RrA^ws6~tT(5jxn4yYxa*y8V_E6=J&0q) zm_1(nxq24Ye8}R&=|%J6j_1wWuZasM5~SgKVBdv(qyc=ybE8j@n1gyve)k+2ARe&= zy^3p=aN}+`u?CztOu9Y;4bAa)1)YRC7!uZAnQ!6Wn$6SNeM?JAa_7z+f@>_)eyRlj z@d_F$-sX|=qAXHgh>%Ij5DGF$DZqtInmjZ>3?anOabpO}A!g_!*a-+#0N__zmz0!* z_z!80drSOp4bShr&y530@OR|VtBrB;w4KzpPQsWM)X&`Vz!x?dWuztCe<%Klfvf2F z)|)%#k{EAmI)3G|PWns(M<;Rh>L`LSD?f$*cj}+kd|0Q?nvUNZe9xWf*v#^Rr}TB| zrCoIV$!C9a&blQSm&>bHE6d*e6#n0+}d(uSV|DCb8ZtzG@qIZ9RG|DbTCf zZ^Iax1q&AZW&FAI=4Xy;)~umKwxk+9mgp!=Nb0jbM3MtHp1|6FXGE+}VN=gXE zxpUv=9{(x)v3%?&o0*xB9XocAlP6D-bLY-|0oV^ZeE2YNa&jV5r%wF}cg*95@&5t+ z!{yQMJpL&DKcavB4uAF^#s5e2&t&*kzmxZWNq#`)em71(lK+qL|3~uvJD&Xy|9@7V z{^S3@pZ{|-XC?d{b@8v1p*d^jqqh1l&3)efiR(vO`;wfqhUDR93G!qwi$2HWqb-so zWn))@zqi)^`X}&ht4yQ=f5#)@{;?p1KK`%Z|D*hGjjsRh|HpyWH~?LuTt2ALaAY$$ zN4TJ`!Rw3n2<~9?HTRec-eCB9BzS>Q6kMUB5$6b}^!2Yka`WdNx#a>Lbb0^cBlbOU zwx#(I{j{V3lmVLjv^v7YZ%9yfXMj}z_W?LFaIkzfoJRp*N59i=D3;C=@|LS>Ag?dt zTqw+&Yrs$x&c&k7j#UmJ7hygJ{9SO76WQN^0}Ox0Z-lu@^j$%p5A<8XIbqy`WhwZp zm_H}P1@M9t_p8f?JOzuuYXR3g$9Z;K^B(6!(FX|qn9wKS35+YF&kXo!)&I)!p=<#F zsh2gJxhV9#K%WJin?>Id^rzART+n|9{S+G4Qtya3{|p}R{#XEduo;fz70{1k|2Sul z^DpR&gWn?+elV}mI4^^*U_yVAQM`Dd{q!wZy?QnISP8xyr`^bDnDfFp zip2B>^jr$g_2QhnDaaQReaI*zGxU#u8hvU0|dvkycfad0;Z+-vi)2EaA+E4U2Db79NTr#e2gX^T@ z7&ZFl;2N+v_lj%3;#?E1`Fe7-8cBYdLhJwsUfDDNJRp^SZ}}*jg@uLW{t-iZKA4LG z`V`m-kTFNhm@A& zk@yoPG!D4_7S4$y4mfXvYxZ;NCC-E6+$F9@N=dtHV_WiSJ zV4k!HCLE!O;L?uA?=7EKN8vo&2Uvd#eFJb#8rLl6)=QjkKtC&-|HL&|acyeuyI2-) z+0DyuZQiN*{TW&_NX45Rx=s|p+COR6_I*(=(KiI=oe+l~DZjPv-_rdGn9IWXc^vnD za&=FO_453NSupnh?z`#d^67hy*REY7FXPXWd;1pBb8)!-6Rsc6t(Ulu$lDjGWY3;G zzomTCOE?$#9DEfj-oBvcKwdwMCU0|7;QA%Wg7wOp&w2dJ_iu|QIG4e@_D^fieyjYJ zzBBjUuNcq&R{5>r{j2W(SAN_2=U4H$wS4}K{BLW#>t}vT-9C^!+9ur;W1W6rG)X@& z>MQ;KGi7|wyBOz-&|3M;+oS(quE7$U1XidN4GnOtgIK&WiV+D6_zuA5`2Gr@0fGs~ zDKL-*W6HSW6o&2K;wKYi%?GfuypE)%R+9Q;hzEF6LvrBWE`V-7nLPzDDc%RbjG6=e z2<&TPywC*bXWK!)?_Dhc>;A9zbKzb7#E+y7`)}BX#6CTaE0mX(kwECr9>dWL2qpPZ z8sHrU01IGo9E=NK-w6Av*eAh0`#dN|6Ux~OHYy|+0961{ZaJX0rUUG12`nru_Por? z&C8AtBaf~hBln6+X&*`K2co^d2Y7}2+6}lL1n`AEc>vH-RQU=1lO9+GBYW3_IEM<24in<9L5RmLE6ome@l8fA|is^+P#SG z+hSklPDXN5{%EtKKRS*vU|$l)T5yj=9OJ-#J$&yM-^xGZNh88*l>qt=Mm-zdg``-~JJNt8e9>p7w~ggRxJ9du7o3XRTKwmv`uqi(Yypbn7B= z&I4@3z|G{~+qy5l{S(-B;9L2loq7MT0c~Sqp9lSCvEPUN9kj8r&xidC^plOa8~Vk! zhy9t;n&&@qt0LhA$K#IVMQk8#OJlzZ`xDr|MSpwjOJKhe`%~x#8X2;?>D%l<=^Rc(S1W4t3bKMeqmh5c7pr8HOl%f%o`I|{xKh3 z-n4XH^yD^qa(O$g6X^aY$Q0cNhcTg)D~AaBe72Q;bKW$+ew-3V68)@6#11Wb{|&C( zUfZ>VFZtNz$LbzAwj#+M(t|9>riu;bX@W6S->GY>cSJjkhC6b0{X_>p(N z=h-AzQ7>-(zw=1S#3@oHM3GzoHiKeAVQm9G^L+sNjY2yNr-!5gxOSK_KV1BU1moRW zFxJh6c?X0anstJ<&k);JZ1>Qvg4n>wAISsS>PT#-!4@ckeZeEa4u}NX49&}?)L3u0 z`h`B8T07kV+cKw|(iCj((WXGV1?>r(*8y81Wqczo_-9E9?q+s6xhm`F{*^liD>p$SU0@`U{3%2%t?wy^p z%W+H;+X5U5#c@y^1Kqn(_XFhd9>?T?x3;|HbH_CBs6AKpL%4@V6zscIhV}!F?_&%D zwufs{v(MUPm7lGv6wo`&?_smfmme*_Q6} zzW+UXrKM-M^tbfe_uS*Y|1(DdBjy;Li@=7Az5tj%2i4RnaI9Dc#o1t-K?zd_C!n@b zR>uFr)X?q}#iUqJSMe$c_MPFQq@^3Lgei)jl7Oxv{uT>!hyqkc&@6amEQek*>J56|EIz^rd#}_;K0BDJou6Kyz}!nG4TVFyo0LrFH2BmA}u?l?fH_#CFuz&l109%}HcJ!MSe zXZyu-y!qpM!+`S7?=67$?BLDM`HrAuA#VhVnn;Pmvq+-@{hT%6V9A3$Z{E^0jnMGx|;Bf-TUCTr>lk9pIU-?@3dqfo=twlk(JX`b-}1k*2;Z@B4Tq z3-7gE1`D2;3^-~6ZYDshEbtM(R$Fh%Q%dkRsu4RDB~OCMCJKjU8xH;fAp9L7A z)5AoNYX;!K;SWk0@|!Dbc*T(#Z0GMQHnb3mwZ9rZefer_ruSI>qKYX4= z%fgq>HGjmSb-_j+;EJ+Uk05ANQ_4EO)*V z039DbCWFcBxPEVOtxL@8MQ>&vae6FRHxBb`#FQZb__%G87iF~*x zvU=lVqFuUjZb++|*g063S{NHSSlC$0OR*&JXTC1o8-Jc>VFjfaS=m}xn@Ovxu=@6B zFRvi4pdinplWvdp3M_er5iErfqm)J|>9X{Bke#p1El#9MSM4=cM%E4{#?q=bcD6Ql zoZ?t4Sx#|7ntsLtrM0;wYMa=tvM@HWhoYs2OHWf^xik9nG6+5xpF2YwJ}^Us>CRwK z7tUT(pEvVhpUxr~gVyZsuk)u(*44pLs`e}HM#yUE)^@$SYKJOgkZQPZ-js@>D{JpL zJm{YuzK>#7&3YFRenoBIibR7c;~uIdsdl#S;l9lxTqfag-?MhT2hUn5bwNJ6c8(EK zJ0Q4HeVD-NDgJU>k_rzOHhAUfOqvk0Cu>Ia+7bC{L~6?%Jynj8XudgzgVQa&_gZW= z`D4STyM|q(V&lejeHQ6fCe_~I`JVn~;;U*MT!s`>&FJkKc<;pUkgab53WA4pUuRTx zXl19Hd0M_RUoEM5)gf@0cd&_cYQ}-0SQr1<)741NJT;*`qUq)v*-MtMUN$AsaO(Pb zce=PluPKkavyutY$?$WlVYyY&pHi{|e|P?_21hEb^&UKMIPy4qUFoFEw;F8OY?gwc zFbKMUfDnVhKbSR;)t`F}EqHfx2M61+a&k7t_O`MPwCKnh+gQ;uCfS9-ApF8CK{znM z`k4fuP*RFtku{n%(nrCEbi&(Txx!)=4Cs{8=CHdOU4)k%=PZR{Y{@e?bNI*t%?`Au!=reY#(4R+Sz8>=@6w( z)qh?%8rtjLj^afJsB=kTv%*s31BCVdbgs*DmekP*GLd+_MtSL=1J?KNk6FHT)J(PKFnD~rnYvM6pd%k$LB>qV<^`{RUczWAtjp*Vy4Ubi? za#d&c-(PZ9M)i(&hI#l7WzCXJiq|?t4|u<9VOci?o7p3{Z3ocSW#IIYJP zg~g%zhjoLF57p|>qvSxQ(YPsdB$GQY5ZyDa?o7x>(+Shg+S(QFDKtpzcr9wfvVA>o z4Pw72deq-PZ*J{M$U~fO%*l4(!f~>KL9cw%yC&fRC zHG(DYBj+=m_ia=NZM+St;CpMi0*`W=8e`$tVMf=!X&TSw8uyr_Kl*0-0+tk_F@Rr! z)t%k4_WQDxg+_!ytsWP?`%g-vZ0AzenALt8hX~n7ggqaW<@0zSU$DpQLEcA{`TArh zyBr@jYs6GFSBZ2aL=qmmB6V{mM&Ym$Gi^9345I_9kWtAalb>> zWxeOO#z?8IE?9jjaVWpEUvT-%D9=B3cVIv4RF|!{%34#u!<4Bi*6l;zC?2^m_F21? z9qan631_c8Yf({u?6O#QnR3^~?Is*uoYy_RiyQP%6x#>=v2)mqunOJNjPu=&4U<#v zo!S4!y@u8M=G^nR;O@DkY(n@P-!&s-WY=EHl5W>!W%2T!i<67|SvteEs870<>>3v_ zvA?;o_K{l_4rik!$Gh&yy?3)u2EQZAT_7LS)PqJfwYtBmuXfH*5viINdMQISJb2ZV zD5$A*JZeH+L%ut!EASjljrO38?Hp8XtfVy@mdVP?u>QdNqFwrHn;1LVnMkWym{~X& zS@KvO(BOk=01HF@57rQTn6C?(0Gv#|Fi@mb939MU>?|DC(3Z$3uti3L8OCCb0!suW z?(-$f@%zwgEK&5^CCU$A_2VGd>oaneM)vm7BcwH#E;liDKm+Mp218(jL zI>huA*gxlHtg>mmj*h}!6QB7v?mFk3Z+JC-sDfF6vE1EKlgK*-PVZ)&^1t<5LpX0i zrGT}bF?#{9a^LrHE{#dte6~+zElm~ZG_I((2?{VnybDO4Y zvEZBcbVGK^bmiwad|%FzQXW_ynY*L&)ZW5!drEqm7~SYvxoO>L*`<5rEOt_ZoSf6S zip>-_we+i2p02iou-bC<4XXwd+{_6JlB2pVgM&mf-x9{qR>5POs(dwWaN zYI63b_QpoE&0)&TA9SNGYaweO_ZoDgMC0qUV&r|F#cFzr=`pbJDO8EP56OWRbg-AB z%W>dQQ>M-*5|7z?EVu9psqwlYu~YbM8vhq+YPM);uT#p4{d-t!X2p**S4~j~dCxJf zq&dcwApd+xX^J)Mvm$3Qx^opdECKK(8n!l;7RGCuRa!oGu-HVUoXSpJF4!YbIj!8m z-rum-72iW4*V%{5uO4_@GvIZ+v4FcUb$;K2eoESDa}Jp^B6B}#-(J}1(5EAI%S+VdUb}_-6EyYLrq@?ta=tj`JSh{Jg~EJj{WGg=IV^(O?~^$sFs~3t2??_wg<^{ zj9jdtqTW%TWOy*zdthw!d(%E|-GjosB$lAJ39_{YIjt*JJbgnS$ z5HHC(klD4ONaOJMFuol!T2+UQ*&D+ud*8k$HfdyhR(ieP4!sVx>-TlhROn4k?bLIu zJa%ef9Lrs>H|To4Mm=v4D5Byiz9PbW;uzB>fdv)KMCPATq-dp%W+_0gf+as{Bo+kF=q2&-36V$XbF@vsbXI4kNAtcsrvWd|usFQH7QG<(!_0n1c?TEFs zwvDNSlMysZQ*9irmvK6!Ts7a;Lo9dZ*Zoi?_CuM_4~05*>f)i;GlKin7Ix{*R!#Na z@IcgSd5LRAPS4v@FDrEG>rr5^drCW{E9nbNuijt1lzCNe)~36?n6GEAIc70&j>8>Y zGr{~5>qc*tT%5Bf)JI7tFzNlK;l}UB=)78I?Kit#c!5>;#WT)}5?(5Y^(=LNF}CE> zmfpoTBh@S=XQbXZ$VDbYreVR{TooTB?c(CiSG=NkvdHsE38>Ob@zG)!@?I;p$aP{$#2y^!~zP1(IR zbspw5G*Z#!)UqcA{n`&vo^RFjlGNOHuTIxZojG#sGi9P@Sr@r>-|X$S`zC6Q$cS?s znyQrhbfn?h3k}}gDrfcjqhg-u9pBtj(MGN+o%|I~cHWl8nkO$lE+_D~z^I|V7X5Z! z9GswMHJ??c(b+UQf8IR1!F%)uKR9@(e|5x#>rc|%O@#~-J|*ol=zV9%%E3kJn1!0* zLj#26s%7SEPkqE^{-kTWTTTbnuAGzKboA=IV>2hbGVhmBI413W`uy!|%a>+-ZkJ4* zq1b!%Gyh=zL5G~Wx$}KskI;L%OJd0zr8}ZR)~C8edFD^bHJxt5xWlxl*mC2%{rHN# z10MD7JFs7{fSCN=agir-rL-TbM@w}s$Sl-*oS@KOJ!<#PfQqXrANyu4+kMF|?#+5D zp+2)%w;9}K?gTV*N4{+4z%u`4Gl%0nl3n=G+Q$JIPA@*wYldxPpk~47x|N&GPI298 z6qYjQix#BCCdP`}WRe+OfjQRuHwhCSvG4|586DI?{SEBC#SBv#dI4w|B;d# zrDwtJAb)Obl;HT|^8Q-y2V`DyV)dEVNj++z{?mhM%1P%=98MBDF#Ks3v!#l2uMS?6 zd?onW`e1{>4SV*g+Zt|}DAb*0b@z1k{29TyrUUlwnK6D<`1t9|UoVkxiyw7p@ScHN z=2SQtsf6eDv6&LrTilv2Q;%Ug;=rtiaF-uuI+6l_-=uQO3%^<=h{W6<`Q z3fmm#RhZ8f(%-RfNpbeD@|-S*O;^?Vi3aCW>N_X+7>(LEU!C9W+Jrr}U7eSA?{zur zG2?{O3CFD)Dm5OY8+NRn{Gs=O^(yl20tV1LEM|ha<+kM?Qvb}3Ej3F#cev-D&GNm(4R+jyRnAxT#3o|W%cpt#g_PDrbL=*nge0UeJ+My zzCXY8x{_rs`==DmbTM|AUa7B@Jr=n_XoPumNJsx&?>FXVxVnm0&g#>{sDTwHx?pC_(AZCE4{Y~T^=(j3 zXRIut+^4zhRL)e>8#G+Jd-3MG!Xd*3?;7}YfLYS`Ge@FRUrSXS_Y%0VD0J#0r_DpZ~hZ}<{iciXzvw|eeTz6Yf-F=OJ#hw9yrQ^0sb<$i>O=&!JWlHAn72c4e zJ2K_QlWF~~xx8O$(N4GMm`Zf6^#^sWSI0Z4z7aICY9A0aKg!?r)QZ(AITH6)tcw(y zBALdTobOcZEpIh;?tG^%OC-dqe5h`=ve|#e1t)Dir8~m7-%b0gSz|s}t?Kz|_lLDL zJx@*XJMy91L&KfE_IHA(uuF^h1-(a*g-K&aYn4R&F`&@up-1*gX1mLx%WcSbcd4i#9eqz?D!~Da^#Wm^z3_6oK;N15|1je`pt8= zXE(@W(PrZ_5uy27&!21%aZ(YB3Jv!a*B>O6BAni@r;F1$)iD+#w<{K`AL`wGX|8L# z(@&4RXU|yKyJG#~OJ!w)cE#STpEvn>T110KKbek)-9!%@RLFIT4Y{yT$??KVn@@Xm zmJQr8v!L2~9RI9UJBJ<8<1*Ht9sgAn6PhpI|l>Rhb>wY(sJ7yd| i{%BW7m+|Z!iRShX%4-}2#zg;-A!i&?q?&xQ@c#j*`>AsP literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/Scripts/python3.dll b/flaskwebproject/FlaskWebProject1/Scripts/python3.dll new file mode 100644 index 0000000000000000000000000000000000000000..3fd275244d3a2baf4f1878248d96c9b578c8a504 GIT binary patch literal 58520 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

-k0UIzjlAB7Y! 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%0Dms)xH#9(bWBs3_>P>{HJQ6k8bK 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

>ZDqQxd{YST5QKpSbi`&LYwM>8bw0T8o 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 YX@9kw2D)TMr&YnTJ2GE`J?8PhniR3AWhh1vN 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ℑ|`3;{@Ocz@-4T036N7 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%0A0em4nLIFj$PLZK@DX?&tS&`h@aFrGW?)l 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%0A0_HOyy^#OfR--@TY>n{fZiCu1w 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
yyBnbY$`mG8?sL%18R%X2qW6~xENhw(L|`Ku`T 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

3}A~q)4cbu#OPbxxr3&55_qd7{# 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

H=3sZ>3@h98wIs%F$ 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�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 z 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≫HM?E>7DRo-S_2hYG)LC^-omV4jR9#RP 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 L&K#4hv-As2t7^;TRbXd*&YVDtG0)>D#pvdJG8% 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�`c-in8(SMDj{8O_Qrfnjrez*v-w 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�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 Pf7IvBR_`pH(BXdou##$X literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/Scripts/pythonw.exe b/flaskwebproject/FlaskWebProject1/Scripts/pythonw.exe new file mode 100644 index 0000000000000000000000000000000000000000..1dbff64270668802a6cc48b51a7ee99254f2f259 GIT binary patch literal 98968 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�?dYNUd4WaURX_A__M4W}D0!0n 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'.format(self=self) + +class Actor(Base): + __tablename__ = 'actors' + + id = Column(BigInteger, primary_key=True) + actorid = Column(Integer) + actorname = Column(String(72)) + countryname = Column(String(36)) + countrytimezone = Column(String(72)) + birthday = Column(Date) + deathday = Column(Date) + gender = Column(String(6)) + mediumimage = Column(TEXT) + originalimage = Column(TEXT) + apilink = Column(TEXT) + url = Column(TEXT) + countrycode = Column(String(12)) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class Castdatum(Base): + __tablename__ = 'castdata' + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + characterid = Column(Integer) + actorid = Column(Integer) + url = Column(TEXT) + charactername = Column(String(250)) + mediumimage = Column(TEXT) + originalimage = Column(TEXT) + apilink = Column(TEXT) + tvmazelink = Column(TEXT) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class Epdatum(Base): + __tablename__ = 'epdata' + + id = Column(BigInteger, primary_key=True) + episodeid = Column(BigInteger) + seriesId = Column(Unicode(64)) + airedSeason = Column(Integer) + airedSeasonID = Column(Integer) + airedEpisodeNumber = Column(Integer) + episodeName = Column(TEXT) + firstAired = Column(Date) + guestStars = Column(TEXT) + director = Column(TEXT) + directors = Column(TEXT) + writers = Column(TEXT) + overview = Column(TEXT) + language_episodeName = Column(String(32)) + language_overview = Column(String(32)) + productionCode = Column(TEXT) + showUrl = Column(TEXT) + lastUpdated = Column(Integer) + dvdDiscid = Column(Unicode(64)) + dvdSeason = Column(Integer) + dvdEpisodeNumber = Column(Integer) + dvdChapter = Column(Integer) + absoluteNumber = Column(Integer) + filename = Column(TEXT) + lastUpdatedBy = Column(Integer) + airsAfterSeason = Column(Integer) + airsBeforeSeason = Column(Integer) + airsBeforeEpisode = Column(Integer) + thumbAuthor = Column(Integer) + thumbAdded = Column(DateTime) + thumbWidth = Column(TEXT) + thumbHeigh = Column(TEXT) + imdbId = Column(String(64)) + siteRating = Column(Float(53)) + siteRatingCount = Column(Float(53)) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class Seriesdatum(Base): + __tablename__ = 'seriesdata' + + id = Column(BigInteger, primary_key=True) + seriesId = Column(String(150), unique=True) + tvdbId = Column(Integer) + tvrageId = Column(Integer) + imdbId = Column(String(25)) + zap2itId = Column(TEXT) + networkId = Column(String(25)) + genre = Column(TEXT) + seriesName = Column(String(150)) + aliases = Column(TEXT) + status = Column(String(25)) + firstAired = Column(String(25)) + airsDayOfWeek = Column(String(72)) + airsTime = Column(String(25)) + runtime = Column(String(25)) + rating = Column(String(25)) + overview = Column(TEXT) + banner = Column(TEXT) + lastUpdated = Column(Integer) + added = Column(DateTime) + addedBy = Column(String(25)) + siteRating = Column(Float(53)) + siteRatingCount = Column(Float(53)) + slug = Column(TEXT) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class Tvnetwork(Base): + __tablename__ = 'tvnetworks' + + id = Column(BigInteger, primary_key=True) + networkid = Column(String(12)) + networkname = Column(String(255)) + countryname = Column(String(255)) + countrycode = Column(String(4)) + countrytimezone = Column(String(25)) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class Tvwebchannel(Base): + __tablename__ = 'tvwebchannels' + + id = Column(BigInteger, primary_key=True) + webchannelname = Column(String(255)) + webchannelcountrycode = Column(String(4)) + webchannelcountryname = Column(String(255)) + webchannelcountrytimezone = Column(String(4)) + + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class EpLink(Base): + __tablename__ = 'ep_links' + __table_args__ = ( + Index('NonClusteredIndex-20180826-114123', 'seriesid', 'episodeid'), + ) + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + episodeid = Column(Integer) + + #seriesdatum = relationship('Seriesdatum') + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbActorLink(Base): + __tablename__ = 'actor_links' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + actorid = Column(Integer) + characterid = Column(Integer) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbActor(Base): + __tablename__ = 'actors' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + actorid = Column(Integer) + actorname = Column(String(72)) + countryname = Column(String(36)) + countrytimezone = Column(String(72)) + birthday = Column(Date) + deathday = Column(Date) + gender = Column(String(6)) + mediumimage = Column(TEXT) + originalimage = Column(TEXT) + apilink = Column(TEXT) + url = Column(TEXT) + countrycode = Column(String(12)) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbCastdatum(Base): + __tablename__ = 'castdata' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + characterid = Column(Integer) + actorid = Column(Integer) + url = Column(TEXT) + charactername = Column(String(250)) + mediumimage = Column(TEXT) + originalimage = Column(TEXT) + apilink = Column(TEXT) + tvmazelink = Column(TEXT) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbEpLink(Base): + __tablename__ = 'ep_links' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + episodeid = Column(Integer) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbEpdatum(Base): + __tablename__ = 'epdata' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + episodeid = Column(BigInteger) + seriesId = Column(Unicode(64)) + airedSeason = Column(Integer) + airedSeasonID = Column(Integer) + airedEpisodeNumber = Column(Integer) + episodeName = Column(TEXT) + firstAired = Column(Date) + guestStars = Column(TEXT) + director = Column(TEXT) + directors = Column(TEXT) + writers = Column(TEXT) + overview = Column(TEXT) + language_episodeName = Column(String(32)) + language_overview = Column(String(32)) + productionCode = Column(TEXT) + showUrl = Column(TEXT) + lastUpdated = Column(Integer) + dvdDiscid = Column(Unicode(64)) + dvdSeason = Column(Integer) + dvdEpisodeNumber = Column(Integer) + dvdChapter = Column(Integer) + absoluteNumber = Column(Integer) + filename = Column(TEXT) + lastUpdatedBy = Column(Integer) + airsAfterSeason = Column(Integer) + airsBeforeSeason = Column(Integer) + airsBeforeEpisode = Column(Integer) + thumbAuthor = Column(Integer) + thumbAdded = Column(DateTime) + thumbWidth = Column(TEXT) + thumbHeigh = Column(TEXT) + imdbId = Column(String(64)) + siteRating = Column(Float(53)) + siteRatingCount = Column(Float(53)) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbSeriesdatum(Base): + __tablename__ = 'seriesdata' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + seriesId = Column(String(150), unique=True) + tvdbId = Column(Integer) + tvrageId = Column(Integer) + imdbId = Column(String(25)) + zap2itId = Column(TEXT) + networkId = Column(String(25)) + genre = Column(TEXT) + seriesName = Column(String(150)) + aliases = Column(TEXT) + status = Column(String(25)) + firstAired = Column(String(25)) + airsDayOfWeek = Column(String(72)) + airsTime = Column(String(25)) + runtime = Column(String(25)) + rating = Column(String(25)) + overview = Column(TEXT) + banner = Column(TEXT) + lastUpdated = Column(Integer) + added = Column(DateTime) + addedBy = Column(String(25)) + siteRating = Column(Float(53)) + siteRatingCount = Column(Float(53)) + slug = Column(TEXT) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbTvnetwork(Base): + __tablename__ = 'tvnetworks' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + networkid = Column(String(12)) + networkname = Column(String(255)) + countryname = Column(String(255)) + countrycode = Column(String(4)) + countrytimezone = Column(String(25)) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class TvdbTvwebchannel(Base): + __tablename__ = 'tvwebchannels' + __table_args__ = {'schema': 'tvdb'} + + id = Column(BigInteger, primary_key=True) + webchannelname = Column(String(255)) + webchannelcountrycode = Column(String(4)) + webchannelcountryname = Column(String(255)) + webchannelcountrytimezone = Column(String(4)) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class UpdatesTvmazeCharacterjson(Base): + __tablename__ = 'tvmaze_characterjson' + __table_args__ = {'schema': 'updates'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + jdata = Column(Unicode) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class UpdatesTvmazeEpisodejson(Base): + __tablename__ = 'tvmaze_episodejson' + __table_args__ = {'schema': 'updates'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + jdata = Column(String(collation='SQL_Latin1_General_CP1_CI_AS')) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class UpdatesTvmazeSeriesjson(Base): + __tablename__ = 'tvmaze_seriesjson' + __table_args__ = {'schema': 'updates'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + jdata = Column(String(collation='SQL_Latin1_General_CP1_CI_AS')) + created_on = Column(DateTime) + updated_on = Column(DateTime) + + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + +class UpdatesTvupdatedatum(Base): + __tablename__ = 'tvupdatedata' + __table_args__ = {'schema': 'updates'} + + id = Column(BigInteger, primary_key=True) + seriesid = Column(Integer) + timestamp = Column(String(15)) + + def __repr__(self): + return u'<{self.__class__.__name__}: {self.id}>'.format(self=self) + diff --git a/flaskwebproject/FlaskWebProject1/routes.py b/flaskwebproject/FlaskWebProject1/routes.py new file mode 100644 index 0000000..e54b52f --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/routes.py @@ -0,0 +1,2 @@ +from datetime import datetime +# Register your routes here. diff --git a/flaskwebproject/FlaskWebProject1/static/content/bootstrap.css b/flaskwebproject/FlaskWebProject1/static/content/bootstrap.css new file mode 100644 index 0000000..6d6e682 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/static/content/bootstrap.css @@ -0,0 +1,6816 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. The notices and licenses below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ +/*! + * Bootstrap v3.0.0 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden] { + display: none; +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a:focus { + outline: thin dotted; +} + +a:active, +a:hover { + outline: 0; +} + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +mark { + color: #000; + background: #ff0; +} + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +pre { + white-space: pre-wrap; +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +legend { + padding: 0; + border: 0; +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100%; +} + +button, +input { + line-height: normal; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + box-sizing: border-box; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input, +select[multiple], +textarea { + background-image: none; +} + +a { + color: #428bca; + text-decoration: none; +} + +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + height: auto; + max-width: 100%; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0 0 0 0); + border: 0; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16.099999999999998px; + font-weight: 200; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small { + font-size: 85%; +} + +cite { + font-style: normal; +} + +.text-muted { + color: #999999; +} + +.text-primary { + color: #428bca; +} + +.text-warning { + color: #c09853; +} + +.text-danger { + color: #b94a48; +} + +.text-success { + color: #468847; +} + +.text-info { + color: #3a87ad; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} + +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} + +h1, +.h1 { + font-size: 36px; +} + +h2, +.h2 { + font-size: 30px; +} + +h3, +.h3 { + font-size: 24px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 14px; +} + +h6, +.h6 { + font-size: 12px; +} + +h1 small, +.h1 small { + font-size: 24px; +} + +h2 small, +.h2 small { + font-size: 18px; +} + +h3 small, +.h3 small, +h4 small, +.h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.428571429; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote p:last-child { + margin-bottom: 0; +} + +blockquote small { + display: block; + line-height: 1.428571429; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} + +code, +pre { + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +.row { + margin-right: -15px; + margin-left: -15px; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-sm-1, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-md-1, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-10, +.col-md-11, +.col-md-12, +.col-lg-1, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-10, +.col-lg-11, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11 { + float: left; +} + +.col-xs-1 { + width: 8.333333333333332%; +} + +.col-xs-2 { + width: 16.666666666666664%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-4 { + width: 33.33333333333333%; +} + +.col-xs-5 { + width: 41.66666666666667%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-7 { + width: 58.333333333333336%; +} + +.col-xs-8 { + width: 66.66666666666666%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-10 { + width: 83.33333333333334%; +} + +.col-xs-11 { + width: 91.66666666666666%; +} + +.col-xs-12 { + width: 100%; +} + +@media (min-width: 768px) { + .container { + max-width: 750px; + } + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11 { + float: left; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-12 { + width: 100%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } +} + +@media (min-width: 992px) { + .container { + max-width: 970px; + } + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11 { + float: left; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-3 { + width: 25%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-6 { + width: 50%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-9 { + width: 75%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-12 { + width: 100%; + } + .col-md-push-0 { + left: auto; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-offset-0 { + margin-left: 0; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1170px; + } + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11 { + float: left; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-12 { + width: 100%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-offset-0 { + margin-left: 0; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } +} + +table { + max-width: 100%; + background-color: transparent; +} + +th { + text-align: left; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table thead > tr > th, +.table tbody > tr > th, +.table tfoot > tr > th, +.table thead > tr > td, +.table tbody > tr > td, +.table tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} + +.table caption + thead tr:first-child th, +.table colgroup + thead tr:first-child th, +.table thead:first-child tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed thead > tr > th, +.table-condensed tbody > tr > th, +.table-condensed tfoot > tr > th, +.table-condensed thead > tr > td, +.table-condensed tbody > tr > td, +.table-condensed tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + display: table-column; + float: none; +} + +table td[class*="col-"], +table th[class*="col-"] { + display: table-cell; + float: none; +} + +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} + +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td { + background-color: #d0e9c6; + border-color: #c9e2b3; +} + +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; + border-color: #eed3d7; +} + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td { + background-color: #ebcccc; + border-color: #e6c1c7; +} + +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; + border-color: #fbeed5; +} + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td { + background-color: #faf2cc; + border-color: #f8e5be; +} + +@media (max-width: 768px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + background-color: #fff; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > thead > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > thead > tr:last-child > td, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} + +input[type="file"] { + display: block; +} + +select[multiple], +select[size] { + height: auto; +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} + +.form-control:-moz-placeholder { + color: #999999; +} + +.form-control::-moz-placeholder { + color: #999999; +} + +.form-control:-ms-input-placeholder { + color: #999999; +} + +.form-control::-webkit-input-placeholder { + color: #999999; +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; + background-color: #ffffff; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle; +} + +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm { + height: 30px; + line-height: 30px; +} + +textarea.input-sm { + height: auto; +} + +.input-lg { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-lg { + height: 45px; + line-height: 45px; +} + +textarea.input-lg { + height: auto; +} + +.has-warning .help-block, +.has-warning .control-label { + color: #c09853; +} + +.has-warning .form-control { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-warning .form-control:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.has-warning .input-group-addon { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.has-error .help-block, +.has-error .control-label { + color: #b94a48; +} + +.has-error .form-control { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-error .form-control:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.has-error .input-group-addon { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.has-success .help-block, +.has-success .control-label { + color: #468847; +} + +.has-success .form-control { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-success .form-control:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.has-success .input-group-addon { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.form-control-static { + padding-top: 7px; + margin-bottom: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} + +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} + +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; +} + +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} + +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} + +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} + +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} + +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} + +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} + +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #39b3d7; + border-color: #269abc; +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} + +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-link { + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} + +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} + +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-sm, +.btn-xs { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs { + padding: 1px 5px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} + +.collapse.in { + display: block; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.glyphicon-briefcase:before { + content: "\1f4bc"; +} + +.glyphicon-calendar:before { + content: "\1f4c5"; +} + +.glyphicon-pushpin:before { + content: "\1f4cc"; +} + +.glyphicon-paperclip:before { + content: "\1f4ce"; +} + +.glyphicon-camera:before { + content: "\1f4f7"; +} + +.glyphicon-lock:before { + content: "\1f512"; +} + +.glyphicon-bell:before { + content: "\1f514"; +} + +.glyphicon-bookmark:before { + content: "\1f516"; +} + +.glyphicon-fire:before { + content: "\1f525"; +} + +.glyphicon-wrench:before { + content: "\1f527"; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-bottom: 0 dotted; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #428bca; +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #428bca; + outline: 0; +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0 dotted; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} + +.btn-default .caret { + border-top-color: #333333; +} + +.btn-primary .caret, +.btn-success .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret { + border-top-color: #fff; +} + +.dropup .btn-default .caret { + border-bottom-color: #333333; +} + +.dropup .btn-primary .caret, +.dropup .btn-success .caret, +.dropup .btn-warning .caret, +.dropup .btn-danger .caret, +.dropup .btn-info .caret { + border-bottom-color: #fff; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar .btn-group { + float: left; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group-xs > .btn { + padding: 5px 10px; + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + display: block; + float: none; + width: 100%; + max-width: 100%; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group > .btn { + float: none; +} + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed; +} + +.btn-group-justified .btn { + display: table-cell; + float: none; + width: 1%; +} + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} + +.input-group.col { + float: none; + padding-right: 0; + padding-left: 0; +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 45px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 45px; + line-height: 45px; +} + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + white-space: nowrap; +} + +.input-group-btn > .btn { + position: relative; +} + +.input-group-btn > .btn + .btn { + margin-left: -4px; +} + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav > li { + position: relative; + display: block; +} + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li.disabled > a { + color: #999999; +} + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #428bca; +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} + +.nav-tabs.nav-justified > li { + float: none; +} + +.nav-tabs.nav-justified > li > a { + text-align: center; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } +} + +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-bottom: 1px solid #dddddd; +} + +.nav-tabs.nav-justified > .active > a { + border-bottom-color: #ffffff; +} + +.nav-pills > li { + float: left; +} + +.nav-pills > li > a { + border-radius: 5px; +} + +.nav-pills > li + li { + margin-left: 2px; +} + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #428bca; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified { + width: 100%; +} + +.nav-justified > li { + float: none; +} + +.nav-justified > li > a { + text-align: center; +} + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } +} + +.nav-tabs-justified { + border-bottom: 0; +} + +.nav-tabs-justified > li > a { + margin-right: 0; + border-bottom: 1px solid #dddddd; +} + +.nav-tabs-justified > .active > a { + border-bottom-color: #ffffff; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: " "; +} + +.tabbable:after { + clear: both; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: " "; +} + +.tabbable:after { + clear: both; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.nav .caret { + border-top-color: #428bca; + border-bottom-color: #428bca; +} + +.nav a:hover .caret { + border-top-color: #2a6496; + border-bottom-color: #2a6496; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + z-index: 1000; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse.in { + overflow-y: auto; +} + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-collapse .navbar-nav.navbar-left:first-child { + margin-left: -15px; + } + .navbar-collapse .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } + .navbar-collapse .navbar-text:last-child { + margin-right: 0; + } +} + +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + border-width: 0 0 1px; +} + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + border-width: 0 0 1px; +} + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + z-index: 1030; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} + +@media (min-width: 768px) { + .navbar > .container .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} + +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -15px; +} + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} + +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} + +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} + +.navbar-text { + float: left; + margin-top: 15px; + margin-bottom: 15px; +} + +@media (min-width: 768px) { + .navbar-text { + margin-right: 15px; + margin-left: 15px; + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} + +.navbar-default .navbar-brand { + color: #777777; +} + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} + +.navbar-default .navbar-text { + color: #777777; +} + +.navbar-default .navbar-nav > li > a { + color: #777777; +} + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} + +.navbar-default .navbar-toggle { + border-color: #dddddd; +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e6e6e6; +} + +.navbar-default .navbar-nav > .dropdown > a:hover .caret, +.navbar-default .navbar-nav > .dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .open > a .caret, +.navbar-default .navbar-nav > .open > a:hover .caret, +.navbar-default .navbar-nav > .open > a:focus .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar-default .navbar-nav > .dropdown > a .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #777777; +} + +.navbar-default .navbar-link:hover { + color: #333333; +} + +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} + +.navbar-inverse .navbar-brand { + color: #999999; +} + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} + +.navbar-inverse .navbar-toggle { + border-color: #333333; +} + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #ffffff; + background-color: #080808; +} + +.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-nav > .dropdown > a .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .navbar-nav > .open > a .caret, +.navbar-inverse .navbar-nav > .open > a:hover .caret, +.navbar-inverse .navbar-nav > .open > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; +} + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #cccccc; + content: "/\00a0"; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} + +.pagination > li { + display: inline; +} + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #eeeeee; +} + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + cursor: default; + background-color: #428bca; + border-color: #428bca; +} + +.pagination > .disabled > span, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; + border-color: #dddddd; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.label-default { + background-color: #999999; +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} + +.label-primary { + background-color: #428bca; +} + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #3071a9; +} + +.label-success { + background-color: #5cb85c; +} + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; + border-radius: 10px; +} + +.badge:empty { + display: none; +} + +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.btn .badge { + position: relative; + top: -1px; +} + +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #428bca; + background-color: #ffffff; +} + +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eeeeee; +} + +.jumbotron h1 { + line-height: 1; + color: inherit; +} + +.jumbotron p { + line-height: 1.4; +} + +.container .jumbotron { + border-radius: 6px; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1 { + font-size: 63px; + } +} + +.thumbnail { + display: inline-block; + display: block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.thumbnail > img { + display: block; + height: auto; + max-width: 100%; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #428bca; +} + +.thumbnail > img { + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} + +.alert h4 { + margin-top: 0; + color: inherit; +} + +.alert .alert-link { + font-weight: bold; +} + +.alert > p, +.alert > ul { + margin-bottom: 0; +} + +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable { + padding-right: 35px; +} + +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success hr { + border-top-color: #c9e2b3; +} + +.alert-success .alert-link { + color: #356635; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info hr { + border-top-color: #a6e1ec; +} + +.alert-info .alert-link { + color: #2d6987; +} + +.alert-warning { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5; +} + +.alert-warning hr { + border-top-color: #f8e5be; +} + +.alert-warning .alert-link { + color: #a47e3c; +} + +.alert-danger { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger hr { + border-top-color: #e6c1c7; +} + +.alert-danger .alert-link { + color: #953b39; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} + +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-striped .progress-bar-info { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media, +.media-body { + overflow: hidden; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + padding-left: 0; + margin-bottom: 20px; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.list-group-item > .badge { + float: right; +} + +.list-group-item > .badge + .badge { + margin-right: 5px; +} + +a.list-group-item { + color: #555555; +} + +a.list-group-item .list-group-item-heading { + color: #333333; +} + +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} + +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #e1edf7; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel > .list-group { + margin-bottom: 0; +} + +.panel > .list-group .list-group-item { + border-width: 1px 0; +} + +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.panel > .table { + margin-bottom: 0; +} + +.panel > .panel-body + .table { + border-top: 1px solid #dddddd; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; +} + +.panel-title > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 4px; +} + +.panel-group .panel + .panel { + margin-top: 5px; +} + +.panel-group .panel-heading { + border-bottom: 0; +} + +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} + +.panel-group .panel-footer { + border-top: 0; +} + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} + +.panel-default { + border-color: #dddddd; +} + +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} + +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} + +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} + +.panel-primary { + border-color: #428bca; +} + +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #428bca; +} + +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #428bca; +} + +.panel-success { + border-color: #d6e9c6; +} + +.panel-success > .panel-heading { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} + +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-warning { + border-color: #fbeed5; +} + +.panel-warning > .panel-heading { + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5; +} + +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #fbeed5; +} + +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #fbeed5; +} + +.panel-danger { + border-color: #eed3d7; +} + +.panel-danger > .panel-heading { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #eed3d7; +} + +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #eed3d7; +} + +.panel-info { + border-color: #bce8f1; +} + +.panel-info > .panel-heading { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} + +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +body.modal-open, +.modal-open .navbar-fixed-top, +.modal-open .navbar-fixed-bottom { + margin-right: 15px; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll; +} + +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-dialog { + z-index: 1050; + width: auto; + padding: 10px; + margin-right: auto; + margin-left: auto; +} + +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} + +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.428571429; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +@media screen and (min-width: 768px) { + .modal-dialog { + right: auto; + left: 50%; + width: 600px; + padding-top: 30px; + padding-bottom: 30px; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; + content: " "; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; + content: " "; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; + content: " "; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; + content: " "; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + height: auto; + max-width: 100%; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.left { + background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + left: 50%; + z-index: 5; + display: inline-block; +} + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} + +.carousel-control .icon-prev:before { + content: '\2039'; +} + +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + border: 1px solid #ffffff; + border-radius: 10px; +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #ffffff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} + +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} + +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} + +.clearfix:after { + clear: both; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} + +@media screen and (max-width: 400px) { + @-ms-viewport { + width: 320px; + } +} + +.hidden { + display: none !important; + visibility: hidden !important; +} + +.visible-xs { + display: none !important; +} + +tr.visible-xs { + display: none !important; +} + +th.visible-xs, +td.visible-xs { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} + +.visible-sm { + display: none !important; +} + +tr.visible-sm { + display: none !important; +} + +th.visible-sm, +td.visible-sm { + display: none !important; +} + +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} + +.visible-md { + display: none !important; +} + +tr.visible-md { + display: none !important; +} + +th.visible-md, +td.visible-md { + display: none !important; +} + +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} + +.visible-lg { + display: none !important; +} + +tr.visible-lg { + display: none !important; +} + +th.visible-lg, +td.visible-lg { + display: none !important; +} + +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} + +.hidden-xs { + display: block !important; +} + +tr.hidden-xs { + display: table-row !important; +} + +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + tr.hidden-xs { + display: none !important; + } + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm { + display: none !important; + } + tr.hidden-xs.hidden-sm { + display: none !important; + } + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md { + display: none !important; + } + tr.hidden-xs.hidden-md { + display: none !important; + } + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-xs.hidden-lg { + display: none !important; + } + tr.hidden-xs.hidden-lg { + display: none !important; + } + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} + +.hidden-sm { + display: block !important; +} + +tr.hidden-sm { + display: table-row !important; +} + +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-sm.hidden-xs { + display: none !important; + } + tr.hidden-sm.hidden-xs { + display: none !important; + } + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } + tr.hidden-sm { + display: none !important; + } + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md { + display: none !important; + } + tr.hidden-sm.hidden-md { + display: none !important; + } + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-sm.hidden-lg { + display: none !important; + } + tr.hidden-sm.hidden-lg { + display: none !important; + } + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} + +.hidden-md { + display: block !important; +} + +tr.hidden-md { + display: table-row !important; +} + +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-md.hidden-xs { + display: none !important; + } + tr.hidden-md.hidden-xs { + display: none !important; + } + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm { + display: none !important; + } + tr.hidden-md.hidden-sm { + display: none !important; + } + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } + tr.hidden-md { + display: none !important; + } + th.hidden-md, + td.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-md.hidden-lg { + display: none !important; + } + tr.hidden-md.hidden-lg { + display: none !important; + } + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} + +.hidden-lg { + display: block !important; +} + +tr.hidden-lg { + display: table-row !important; +} + +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-lg.hidden-xs { + display: none !important; + } + tr.hidden-lg.hidden-xs { + display: none !important; + } + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm { + display: none !important; + } + tr.hidden-lg.hidden-sm { + display: none !important; + } + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md { + display: none !important; + } + tr.hidden-lg.hidden-md { + display: none !important; + } + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } + tr.hidden-lg { + display: none !important; + } + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +tr.visible-print { + display: none !important; +} + +th.visible-print, +td.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print { + display: none !important; + } + tr.hidden-print { + display: none !important; + } + th.hidden-print, + td.hidden-print { + display: none !important; + } +} \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/static/content/bootstrap.min.css b/flaskwebproject/FlaskWebProject1/static/content/bootstrap.min.css new file mode 100644 index 0000000..df89a50 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/static/content/bootstrap.min.css @@ -0,0 +1,20 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. The notices and licenses below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ +/*! + * Bootstrap v3.0.0 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + *//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/static/content/site.css b/flaskwebproject/FlaskWebProject1/static/content/site.css new file mode 100644 index 0000000..a958afb --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/static/content/site.css @@ -0,0 +1,42 @@ +body { + padding-top: 50px; + padding-bottom: 20px; +} + +/* Set padding to keep content from hitting the edges */ +.body-content { + padding-left: 15px; + padding-right: 15px; +} + +/* Set width on the form input elements since they're 100% wide by default */ +input, +select, +textarea { + max-width: 280px; +} + +/* styles for validation helpers */ +.field-validation-error { + color: #b94a48; +} + +.field-validation-valid { + display: none; +} + +input.input-validation-error { + border: 1px solid #b94a48; +} + +input[type="checkbox"].input-validation-error { + border: 0 none; +} + +.validation-summary-errors { + color: #b94a48; +} + +.validation-summary-valid { + display: none; +} \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.eot b/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..87eaa434234e2a984c261e0450a2f4ad837aa7b4 GIT binary patch literal 14079 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 literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.svg b/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..5fee068 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.ttf b/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..be784dc1d5bcb92ab155f578f3723524a3dd9688 GIT binary patch literal 29512 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 DlhOCh literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.woff b/flaskwebproject/FlaskWebProject1/static/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..2cc3e4852a5a42e6aadd6284e067b66e14a57bc7 GIT binary patch literal 16448 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 literal 0 HcmV?d00001 diff --git a/flaskwebproject/FlaskWebProject1/static/scripts/bootstrap.js b/flaskwebproject/FlaskWebProject1/static/scripts/bootstrap.js new file mode 100644 index 0000000..5aa9982 --- /dev/null +++ b/flaskwebproject/FlaskWebProject1/static/scripts/bootstrap.js @@ -0,0 +1,2014 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. Insofar as a script file is dual licensed under GPL, + * Microsoft neither took the code under GPL nor distributes it thereunder but + * under the terms set out in this paragraph. All notices and licenses + * below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ + +/** +* bootstrap.js v3.0.0 by @fat and @mdo +* Copyright 2013 Twitter Inc. +* http://www.apache.org/licenses/LICENSE-2.0 +*/ +if (!jQuery) { throw new Error("Bootstrap requires jQuery") } + +/* ======================================================================== + * Bootstrap: transition.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#transitions + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false, $el = this + $(this).one($.support.transition.end, function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#alerts + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.hasClass('alert') ? $this : $this.parent() + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent.trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(150) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#buttons + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + } + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (!data.resetText) $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d); + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + .prop('checked', !this.$element.hasClass('active')) + .trigger('change') + if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') + } + + this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + e.preventDefault() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#carousel + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.DEFAULTS = { + interval: 5000 + , pause: 'hover' + , wrap: true + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getActiveIndex = function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + + return this.$items.index(this.$active) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getActiveIndex() + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + this.sliding = true + + isCycling && this.pause() + + var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + .emulateTransitionEnd(600) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#collapse + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null + + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var actives = this.$parent && this.$parent.find('> .panel > .in') + + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) + + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } + + $target.collapse(option) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#dropdowns + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * 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. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + var $el = $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we we use a backdrop because click events don't delegate + $('

kX_GH=u6 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