From d99f05a84d0e3a03e5c1c1291ce736a23230fb0d Mon Sep 17 00:00:00 2001 From: Bitfroest Date: Fri, 22 Feb 2019 11:11:01 +0100 Subject: [PATCH] add needed modules and add version file --- ContentCenterLoader.py | 58 +- modules/.gitignore | 1 - modules/ContentCenter.py | 5 +- modules/modules/bin/chardetect.exe | Bin 0 -> 102765 bytes .../DESCRIPTION.rst | 45 + .../certifi-2018.11.29.dist-info/INSTALLER | 1 + .../certifi-2018.11.29.dist-info/LICENSE.txt | 21 + .../certifi-2018.11.29.dist-info/METADATA | 69 + .../certifi-2018.11.29.dist-info/RECORD | 15 + .../certifi-2018.11.29.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../DESCRIPTION.rst | 48 + .../certifi-2018.4.16.dist-info/INSTALLER | 1 + .../certifi-2018.4.16.dist-info/LICENSE.txt | 21 + .../certifi-2018.4.16.dist-info/METADATA | 71 + .../certifi-2018.4.16.dist-info/RECORD | 15 + .../modules/certifi-2018.4.16.dist-info/WHEEL | 6 + .../certifi-2018.4.16.dist-info/metadata.json | 1 + .../certifi-2018.4.16.dist-info/top_level.txt | 1 + modules/modules/certifi/__init__.py | 3 + modules/modules/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 229 bytes .../__pycache__/__main__.cpython-36.pyc | Bin 0 -> 220 bytes .../certifi/__pycache__/core.cpython-36.pyc | Bin 0 -> 490 bytes modules/modules/certifi/cacert.pem | 4512 +++++++++ modules/modules/certifi/core.py | 20 + .../chardet-3.0.4.dist-info/DESCRIPTION.rst | 70 + .../modules/chardet-3.0.4.dist-info/INSTALLER | 1 + .../modules/chardet-3.0.4.dist-info/METADATA | 96 + .../modules/chardet-3.0.4.dist-info/RECORD | 91 + modules/modules/chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/metadata.json | 1 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + modules/modules/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 816 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 54703 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 1092 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6288 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 2199 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 3425 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 2856 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 332 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 1099 bytes .../chardet/__pycache__/enums.cpython-36.pyc | Bin 0 -> 2590 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 2581 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 7338 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2385 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 24089 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 1100 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 54712 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 1100 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 38354 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 1108 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2942 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 44498 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38637 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24852 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30403 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24530 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23384 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24826 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23363 bytes .../langturkishmodel.cpython-36.pyc | Bin 0 -> 23381 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2913 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 2204 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1095 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 17548 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2957 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1585 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2411 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 5806 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1942 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 411 bytes modules/modules/chardet/big5freq.py | 386 + modules/modules/chardet/big5prober.py | 47 + modules/modules/chardet/chardistribution.py | 233 + modules/modules/chardet/charsetgroupprober.py | 106 + modules/modules/chardet/charsetprober.py | 145 + modules/modules/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 168 bytes .../cli/__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 2639 bytes modules/modules/chardet/cli/chardetect.py | 85 + modules/modules/chardet/codingstatemachine.py | 88 + modules/modules/chardet/compat.py | 34 + modules/modules/chardet/cp949prober.py | 49 + modules/modules/chardet/enums.py | 76 + modules/modules/chardet/escprober.py | 101 + modules/modules/chardet/escsm.py | 246 + modules/modules/chardet/eucjpprober.py | 92 + modules/modules/chardet/euckrfreq.py | 195 + modules/modules/chardet/euckrprober.py | 47 + modules/modules/chardet/euctwfreq.py | 387 + modules/modules/chardet/euctwprober.py | 46 + modules/modules/chardet/gb2312freq.py | 283 + modules/modules/chardet/gb2312prober.py | 46 + modules/modules/chardet/hebrewprober.py | 292 + modules/modules/chardet/jisfreq.py | 325 + modules/modules/chardet/jpcntx.py | 233 + modules/modules/chardet/langbulgarianmodel.py | 228 + modules/modules/chardet/langcyrillicmodel.py | 333 + modules/modules/chardet/langgreekmodel.py | 225 + modules/modules/chardet/langhebrewmodel.py | 200 + modules/modules/chardet/langhungarianmodel.py | 225 + modules/modules/chardet/langthaimodel.py | 199 + modules/modules/chardet/langturkishmodel.py | 193 + modules/modules/chardet/latin1prober.py | 145 + modules/modules/chardet/mbcharsetprober.py | 91 + modules/modules/chardet/mbcsgroupprober.py | 54 + modules/modules/chardet/mbcssm.py | 572 ++ modules/modules/chardet/sbcharsetprober.py | 132 + modules/modules/chardet/sbcsgroupprober.py | 73 + modules/modules/chardet/sjisprober.py | 92 + modules/modules/chardet/universaldetector.py | 286 + modules/modules/chardet/utf8prober.py | 82 + modules/modules/chardet/version.py | 9 + modules/modules/idna-2.7.dist-info/INSTALLER | 1 + .../modules/idna-2.7.dist-info/LICENSE.txt | 80 + modules/modules/idna-2.7.dist-info/METADATA | 239 + modules/modules/idna-2.7.dist-info/RECORD | 22 + modules/modules/idna-2.7.dist-info/WHEEL | 6 + .../modules/idna-2.7.dist-info/top_level.txt | 1 + modules/modules/idna-2.8.dist-info/INSTALLER | 1 + .../modules/idna-2.8.dist-info/LICENSE.rst | 80 + modules/modules/idna-2.8.dist-info/METADATA | 239 + modules/modules/idna-2.8.dist-info/RECORD | 22 + modules/modules/idna-2.8.dist-info/WHEEL | 6 + .../modules/idna-2.8.dist-info/top_level.txt | 1 + modules/modules/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 227 bytes .../idna/__pycache__/codec.cpython-36.pyc | Bin 0 -> 3074 bytes .../idna/__pycache__/compat.cpython-36.pyc | Bin 0 -> 587 bytes .../idna/__pycache__/core.cpython-36.pyc | Bin 0 -> 9127 bytes .../idna/__pycache__/idnadata.cpython-36.pyc | Bin 0 -> 29766 bytes .../idna/__pycache__/intranges.cpython-36.pyc | Bin 0 -> 1788 bytes .../__pycache__/package_data.cpython-36.pyc | Bin 0 -> 181 bytes .../idna/__pycache__/uts46data.cpython-36.pyc | Bin 0 -> 241776 bytes modules/modules/idna/codec.py | 118 + modules/modules/idna/compat.py | 12 + modules/modules/idna/core.py | 396 + modules/modules/idna/idnadata.py | 1979 ++++ modules/modules/idna/intranges.py | 53 + modules/modules/idna/package_data.py | 2 + modules/modules/idna/uts46data.py | 8205 +++++++++++++++++ .../requests-2.19.1.dist-info/DESCRIPTION.rst | 1684 ++++ .../requests-2.19.1.dist-info/INSTALLER | 1 + .../requests-2.19.1.dist-info/LICENSE.txt | 13 + .../requests-2.19.1.dist-info/METADATA | 1721 ++++ .../modules/requests-2.19.1.dist-info/RECORD | 44 + .../modules/requests-2.19.1.dist-info/WHEEL | 6 + .../requests-2.19.1.dist-info/metadata.json | 1 + .../requests-2.19.1.dist-info/top_level.txt | 1 + .../requests-2.21.0.dist-info/INSTALLER | 1 + .../modules/requests-2.21.0.dist-info/LICENSE | 13 + .../requests-2.21.0.dist-info/METADATA | 146 + .../modules/requests-2.21.0.dist-info/RECORD | 42 + .../modules/requests-2.21.0.dist-info/WHEEL | 6 + .../requests-2.21.0.dist-info/top_level.txt | 1 + modules/modules/requests/__init__.py | 131 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3338 bytes .../__pycache__/__version__.cpython-36.pyc | Bin 0 -> 524 bytes .../_internal_utils.cpython-36.pyc | Bin 0 -> 1282 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 16801 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 6465 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 8316 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 595 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1629 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18761 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 5469 bytes .../requests/__pycache__/help.cpython-36.pyc | Bin 0 -> 2602 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 954 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 24064 bytes .../__pycache__/packages.cpython-36.pyc | Bin 0 -> 406 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 19400 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 4752 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4353 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 22070 bytes modules/modules/requests/__version__.py | 14 + modules/modules/requests/_internal_utils.py | 42 + modules/modules/requests/adapters.py | 533 ++ modules/modules/requests/api.py | 158 + modules/modules/requests/auth.py | 305 + modules/modules/requests/certs.py | 18 + modules/modules/requests/compat.py | 70 + modules/modules/requests/cookies.py | 549 ++ modules/modules/requests/exceptions.py | 126 + modules/modules/requests/help.py | 119 + modules/modules/requests/hooks.py | 34 + modules/modules/requests/models.py | 953 ++ modules/modules/requests/packages.py | 14 + modules/modules/requests/sessions.py | 770 ++ modules/modules/requests/status_codes.py | 120 + modules/modules/requests/structures.py | 103 + modules/modules/requests/utils.py | 977 ++ .../urllib3-1.23.dist-info/DESCRIPTION.rst | 1040 +++ .../modules/urllib3-1.23.dist-info/INSTALLER | 1 + .../urllib3-1.23.dist-info/LICENSE.txt | 19 + .../modules/urllib3-1.23.dist-info/METADATA | 1077 +++ modules/modules/urllib3-1.23.dist-info/RECORD | 80 + modules/modules/urllib3-1.23.dist-info/WHEEL | 6 + .../urllib3-1.23.dist-info/metadata.json | 1 + .../urllib3-1.23.dist-info/top_level.txt | 1 + .../urllib3-1.24.1.dist-info/INSTALLER | 1 + .../urllib3-1.24.1.dist-info/LICENSE.txt | 19 + .../modules/urllib3-1.24.1.dist-info/METADATA | 1111 +++ .../modules/urllib3-1.24.1.dist-info/RECORD | 78 + .../modules/urllib3-1.24.1.dist-info/WHEEL | 6 + .../urllib3-1.24.1.dist-info/top_level.txt | 1 + modules/modules/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2174 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10661 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 10114 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 23636 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10373 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5843 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2733 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 12940 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5555 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 18755 bytes modules/modules/urllib3/_collections.py | 329 + modules/modules/urllib3/connection.py | 391 + modules/modules/urllib3/connectionpool.py | 896 ++ modules/modules/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 172 bytes .../_appengine_environ.cpython-36.pyc | Bin 0 -> 1068 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 8263 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3214 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 14479 bytes .../securetransport.cpython-36.pyc | Bin 0 -> 17867 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 4878 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 189 bytes .../__pycache__/bindings.cpython-36.pyc | Bin 0 -> 10404 bytes .../__pycache__/low_level.cpython-36.pyc | Bin 0 -> 7465 bytes .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + modules/modules/urllib3/contrib/appengine.py | 289 + modules/modules/urllib3/contrib/ntlmpool.py | 111 + modules/modules/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 ++ modules/modules/urllib3/contrib/socks.py | 192 + modules/modules/urllib3/exceptions.py | 246 + modules/modules/urllib3/fields.py | 178 + modules/modules/urllib3/filepost.py | 98 + modules/modules/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 298 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 24470 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 183 bytes .../__pycache__/makefile.cpython-36.pyc | Bin 0 -> 1277 bytes .../urllib3/packages/backports/makefile.py | 53 + modules/modules/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 559 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 3262 bytes .../ssl_match_hostname/_implementation.py | 156 + modules/modules/urllib3/poolmanager.py | 450 + modules/modules/urllib3/request.py | 150 + modules/modules/urllib3/response.py | 705 ++ modules/modules/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1102 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3139 bytes .../util/__pycache__/queue.cpython-36.pyc | Bin 0 -> 1013 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 3194 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1942 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 12628 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 9496 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8743 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 5162 bytes .../util/__pycache__/wait.cpython-36.pyc | Bin 0 -> 3123 bytes modules/modules/urllib3/util/connection.py | 134 + modules/modules/urllib3/util/queue.py | 21 + modules/modules/urllib3/util/request.py | 118 + modules/modules/urllib3/util/response.py | 87 + modules/modules/urllib3/util/retry.py | 411 + modules/modules/urllib3/util/ssl_.py | 381 + modules/modules/urllib3/util/timeout.py | 242 + modules/modules/urllib3/util/url.py | 230 + modules/modules/urllib3/util/wait.py | 150 + version.json | 1 + 282 files changed, 44793 insertions(+), 39 deletions(-) create mode 100644 modules/modules/bin/chardetect.exe create mode 100644 modules/modules/certifi-2018.11.29.dist-info/DESCRIPTION.rst create mode 100644 modules/modules/certifi-2018.11.29.dist-info/INSTALLER create mode 100644 modules/modules/certifi-2018.11.29.dist-info/LICENSE.txt create mode 100644 modules/modules/certifi-2018.11.29.dist-info/METADATA create mode 100644 modules/modules/certifi-2018.11.29.dist-info/RECORD create mode 100644 modules/modules/certifi-2018.11.29.dist-info/WHEEL create mode 100644 modules/modules/certifi-2018.11.29.dist-info/metadata.json create mode 100644 modules/modules/certifi-2018.11.29.dist-info/top_level.txt create mode 100644 modules/modules/certifi-2018.4.16.dist-info/DESCRIPTION.rst create mode 100644 modules/modules/certifi-2018.4.16.dist-info/INSTALLER create mode 100644 modules/modules/certifi-2018.4.16.dist-info/LICENSE.txt create mode 100644 modules/modules/certifi-2018.4.16.dist-info/METADATA create mode 100644 modules/modules/certifi-2018.4.16.dist-info/RECORD create mode 100644 modules/modules/certifi-2018.4.16.dist-info/WHEEL create mode 100644 modules/modules/certifi-2018.4.16.dist-info/metadata.json create mode 100644 modules/modules/certifi-2018.4.16.dist-info/top_level.txt create mode 100644 modules/modules/certifi/__init__.py create mode 100644 modules/modules/certifi/__main__.py create mode 100644 modules/modules/certifi/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/certifi/__pycache__/__main__.cpython-36.pyc create mode 100644 modules/modules/certifi/__pycache__/core.cpython-36.pyc create mode 100644 modules/modules/certifi/cacert.pem create mode 100644 modules/modules/certifi/core.py create mode 100644 modules/modules/chardet-3.0.4.dist-info/DESCRIPTION.rst create mode 100644 modules/modules/chardet-3.0.4.dist-info/INSTALLER create mode 100644 modules/modules/chardet-3.0.4.dist-info/METADATA create mode 100644 modules/modules/chardet-3.0.4.dist-info/RECORD create mode 100644 modules/modules/chardet-3.0.4.dist-info/WHEEL create mode 100644 modules/modules/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 modules/modules/chardet-3.0.4.dist-info/metadata.json create mode 100644 modules/modules/chardet-3.0.4.dist-info/top_level.txt create mode 100644 modules/modules/chardet/__init__.py create mode 100644 modules/modules/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/enums.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/langturkishmodel.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 modules/modules/chardet/__pycache__/version.cpython-36.pyc create mode 100644 modules/modules/chardet/big5freq.py create mode 100644 modules/modules/chardet/big5prober.py create mode 100644 modules/modules/chardet/chardistribution.py create mode 100644 modules/modules/chardet/charsetgroupprober.py create mode 100644 modules/modules/chardet/charsetprober.py create mode 100644 modules/modules/chardet/cli/__init__.py create mode 100644 modules/modules/chardet/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/chardet/cli/__pycache__/chardetect.cpython-36.pyc create mode 100644 modules/modules/chardet/cli/chardetect.py create mode 100644 modules/modules/chardet/codingstatemachine.py create mode 100644 modules/modules/chardet/compat.py create mode 100644 modules/modules/chardet/cp949prober.py create mode 100644 modules/modules/chardet/enums.py create mode 100644 modules/modules/chardet/escprober.py create mode 100644 modules/modules/chardet/escsm.py create mode 100644 modules/modules/chardet/eucjpprober.py create mode 100644 modules/modules/chardet/euckrfreq.py create mode 100644 modules/modules/chardet/euckrprober.py create mode 100644 modules/modules/chardet/euctwfreq.py create mode 100644 modules/modules/chardet/euctwprober.py create mode 100644 modules/modules/chardet/gb2312freq.py create mode 100644 modules/modules/chardet/gb2312prober.py create mode 100644 modules/modules/chardet/hebrewprober.py create mode 100644 modules/modules/chardet/jisfreq.py create mode 100644 modules/modules/chardet/jpcntx.py create mode 100644 modules/modules/chardet/langbulgarianmodel.py create mode 100644 modules/modules/chardet/langcyrillicmodel.py create mode 100644 modules/modules/chardet/langgreekmodel.py create mode 100644 modules/modules/chardet/langhebrewmodel.py create mode 100644 modules/modules/chardet/langhungarianmodel.py create mode 100644 modules/modules/chardet/langthaimodel.py create mode 100644 modules/modules/chardet/langturkishmodel.py create mode 100644 modules/modules/chardet/latin1prober.py create mode 100644 modules/modules/chardet/mbcharsetprober.py create mode 100644 modules/modules/chardet/mbcsgroupprober.py create mode 100644 modules/modules/chardet/mbcssm.py create mode 100644 modules/modules/chardet/sbcharsetprober.py create mode 100644 modules/modules/chardet/sbcsgroupprober.py create mode 100644 modules/modules/chardet/sjisprober.py create mode 100644 modules/modules/chardet/universaldetector.py create mode 100644 modules/modules/chardet/utf8prober.py create mode 100644 modules/modules/chardet/version.py create mode 100644 modules/modules/idna-2.7.dist-info/INSTALLER create mode 100644 modules/modules/idna-2.7.dist-info/LICENSE.txt create mode 100644 modules/modules/idna-2.7.dist-info/METADATA create mode 100644 modules/modules/idna-2.7.dist-info/RECORD create mode 100644 modules/modules/idna-2.7.dist-info/WHEEL create mode 100644 modules/modules/idna-2.7.dist-info/top_level.txt create mode 100644 modules/modules/idna-2.8.dist-info/INSTALLER create mode 100644 modules/modules/idna-2.8.dist-info/LICENSE.rst create mode 100644 modules/modules/idna-2.8.dist-info/METADATA create mode 100644 modules/modules/idna-2.8.dist-info/RECORD create mode 100644 modules/modules/idna-2.8.dist-info/WHEEL create mode 100644 modules/modules/idna-2.8.dist-info/top_level.txt create mode 100644 modules/modules/idna/__init__.py create mode 100644 modules/modules/idna/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/codec.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/compat.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/core.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/idnadata.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/intranges.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/package_data.cpython-36.pyc create mode 100644 modules/modules/idna/__pycache__/uts46data.cpython-36.pyc create mode 100644 modules/modules/idna/codec.py create mode 100644 modules/modules/idna/compat.py create mode 100644 modules/modules/idna/core.py create mode 100644 modules/modules/idna/idnadata.py create mode 100644 modules/modules/idna/intranges.py create mode 100644 modules/modules/idna/package_data.py create mode 100644 modules/modules/idna/uts46data.py create mode 100644 modules/modules/requests-2.19.1.dist-info/DESCRIPTION.rst create mode 100644 modules/modules/requests-2.19.1.dist-info/INSTALLER create mode 100644 modules/modules/requests-2.19.1.dist-info/LICENSE.txt create mode 100644 modules/modules/requests-2.19.1.dist-info/METADATA create mode 100644 modules/modules/requests-2.19.1.dist-info/RECORD create mode 100644 modules/modules/requests-2.19.1.dist-info/WHEEL create mode 100644 modules/modules/requests-2.19.1.dist-info/metadata.json create mode 100644 modules/modules/requests-2.19.1.dist-info/top_level.txt create mode 100644 modules/modules/requests-2.21.0.dist-info/INSTALLER create mode 100644 modules/modules/requests-2.21.0.dist-info/LICENSE create mode 100644 modules/modules/requests-2.21.0.dist-info/METADATA create mode 100644 modules/modules/requests-2.21.0.dist-info/RECORD create mode 100644 modules/modules/requests-2.21.0.dist-info/WHEEL create mode 100644 modules/modules/requests-2.21.0.dist-info/top_level.txt create mode 100644 modules/modules/requests/__init__.py create mode 100644 modules/modules/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/__version__.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/_internal_utils.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/api.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/auth.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/certs.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/compat.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/help.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/models.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/packages.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/structures.cpython-36.pyc create mode 100644 modules/modules/requests/__pycache__/utils.cpython-36.pyc create mode 100644 modules/modules/requests/__version__.py create mode 100644 modules/modules/requests/_internal_utils.py create mode 100644 modules/modules/requests/adapters.py create mode 100644 modules/modules/requests/api.py create mode 100644 modules/modules/requests/auth.py create mode 100644 modules/modules/requests/certs.py create mode 100644 modules/modules/requests/compat.py create mode 100644 modules/modules/requests/cookies.py create mode 100644 modules/modules/requests/exceptions.py create mode 100644 modules/modules/requests/help.py create mode 100644 modules/modules/requests/hooks.py create mode 100644 modules/modules/requests/models.py create mode 100644 modules/modules/requests/packages.py create mode 100644 modules/modules/requests/sessions.py create mode 100644 modules/modules/requests/status_codes.py create mode 100644 modules/modules/requests/structures.py create mode 100644 modules/modules/requests/utils.py create mode 100644 modules/modules/urllib3-1.23.dist-info/DESCRIPTION.rst create mode 100644 modules/modules/urllib3-1.23.dist-info/INSTALLER create mode 100644 modules/modules/urllib3-1.23.dist-info/LICENSE.txt create mode 100644 modules/modules/urllib3-1.23.dist-info/METADATA create mode 100644 modules/modules/urllib3-1.23.dist-info/RECORD create mode 100644 modules/modules/urllib3-1.23.dist-info/WHEEL create mode 100644 modules/modules/urllib3-1.23.dist-info/metadata.json create mode 100644 modules/modules/urllib3-1.23.dist-info/top_level.txt create mode 100644 modules/modules/urllib3-1.24.1.dist-info/INSTALLER create mode 100644 modules/modules/urllib3-1.24.1.dist-info/LICENSE.txt create mode 100644 modules/modules/urllib3-1.24.1.dist-info/METADATA create mode 100644 modules/modules/urllib3-1.24.1.dist-info/RECORD create mode 100644 modules/modules/urllib3-1.24.1.dist-info/WHEEL create mode 100644 modules/modules/urllib3-1.24.1.dist-info/top_level.txt create mode 100644 modules/modules/urllib3/__init__.py create mode 100644 modules/modules/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 modules/modules/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 modules/modules/urllib3/_collections.py create mode 100644 modules/modules/urllib3/connection.py create mode 100644 modules/modules/urllib3/connectionpool.py create mode 100644 modules/modules/urllib3/contrib/__init__.py create mode 100644 modules/modules/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/_appengine_environ.py create mode 100644 modules/modules/urllib3/contrib/_securetransport/__init__.py create mode 100644 modules/modules/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc create mode 100644 modules/modules/urllib3/contrib/_securetransport/bindings.py create mode 100644 modules/modules/urllib3/contrib/_securetransport/low_level.py create mode 100644 modules/modules/urllib3/contrib/appengine.py create mode 100644 modules/modules/urllib3/contrib/ntlmpool.py create mode 100644 modules/modules/urllib3/contrib/pyopenssl.py create mode 100644 modules/modules/urllib3/contrib/securetransport.py create mode 100644 modules/modules/urllib3/contrib/socks.py create mode 100644 modules/modules/urllib3/exceptions.py create mode 100644 modules/modules/urllib3/fields.py create mode 100644 modules/modules/urllib3/filepost.py create mode 100644 modules/modules/urllib3/packages/__init__.py create mode 100644 modules/modules/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/backports/__init__.py create mode 100644 modules/modules/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/backports/makefile.py create mode 100644 modules/modules/urllib3/packages/six.py create mode 100644 modules/modules/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 modules/modules/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 modules/modules/urllib3/poolmanager.py create mode 100644 modules/modules/urllib3/request.py create mode 100644 modules/modules/urllib3/response.py create mode 100644 modules/modules/urllib3/util/__init__.py create mode 100644 modules/modules/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/queue.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/__pycache__/wait.cpython-36.pyc create mode 100644 modules/modules/urllib3/util/connection.py create mode 100644 modules/modules/urllib3/util/queue.py create mode 100644 modules/modules/urllib3/util/request.py create mode 100644 modules/modules/urllib3/util/response.py create mode 100644 modules/modules/urllib3/util/retry.py create mode 100644 modules/modules/urllib3/util/ssl_.py create mode 100644 modules/modules/urllib3/util/timeout.py create mode 100644 modules/modules/urllib3/util/url.py create mode 100644 modules/modules/urllib3/util/wait.py create mode 100644 version.json diff --git a/ContentCenterLoader.py b/ContentCenterLoader.py index 7eebc09..0d99039 100644 --- a/ContentCenterLoader.py +++ b/ContentCenterLoader.py @@ -18,11 +18,11 @@ module_module_dir = os.path.abspath(os.path.join(module_dir, "modules")) sys.path.append(module_module_dir) -import pip -import requests -import lockfile +try: + import requests +except: + pass -version = "v1.2.4.2" _app = None _ui = None @@ -36,34 +36,30 @@ def versiontuple(v): v = v.replace('v', '') return tuple(map(int, (v.split(".")))) -def install(path, requirementsFileName): - os.makedirs(path, exist_ok=True) - if hasattr(pip, 'main'): - with open(requirementsFileName) as f: - for line in f: - pip.main(['install', '-U', line, '-t', path, '--ignore-installed', '-q']) - else: - with open(requirementsFileName) as f: - from pip._internal import main - for line in f: - main(['install', '-U', line, '-t', path, '--ignore-installed', '-q']) - - def update(context): - global version, _ui, isMac + global _ui, isMac currentFolder = os.path.dirname(os.path.realpath(__file__)) currentFolder = os.path.join(currentFolder, '') # cwd = os.getcwd() + try: + with open(os.path.join(script_dir,'version.json')) as f: + data = json.load(f) + version = data['tag_name'] + print(version) + except: + version = "999" + print('Failed:\n{}'.format(traceback.format_exc())) + pass - releasesURI = 'https://api.github.com/repos/Bitfroest/contentcenter_fusion360/releases' + releasesURI = 'https://custom.hk-fs.de/uploads/version.json' if isMac: proc = subprocess.Popen(['curl', releasesURI], stdout=subprocess.PIPE) (out, err) = proc.communicate() j = json.loads(out.decode('utf-8')) - tag_name = j[0]['tag_name'] - tarball_url = j[0]['tarball_url'] - published_at = j[0]['published_at'] + tag_name = j['tag_name'] + tarball_url = j['tarball_url'] + published_at = j['published_at'] if versiontuple(tag_name) > versiontuple(version): # Check if the URL is reachable @@ -99,12 +95,6 @@ def update(context): # copy all extracted contents to add in folder shutil.copytree(tempDirectory, os.path.join(currentFolder, '')) - if os.path.isfile(os.path.join(currentFolder, 'requirements.txt')): - modulesFolder= os.path.join(os.path.join(currentFolder, 'modules'), 'modules') - if not os.path.exists(modulesFolder): - os.makedirs(modulesFolder) - install(modulesFolder, os.path.join(currentFolder, 'requirements.txt')) - if os.path.isfile(os.path.join(os.path.join(currentFolder, 'modules'), 'ContentCenter.py')): # updated and now reload the function try: @@ -118,9 +108,9 @@ def update(context): r = requests.get(releasesURI) if r.status_code == 200: releases = r.json() - tag_name = releases[0]['tag_name'] - tarball_url = releases[0]['tarball_url'] - published_at = releases[0]['published_at'] + tag_name = releases['tag_name'] + tarball_url = releases['tarball_url'] + published_at = releases['published_at'] # _ui.messageBox(str(tag_name)) if versiontuple(tag_name) > versiontuple(version): @@ -158,12 +148,6 @@ def update(context): # copy all extracted contents to add in folder shutil.copytree(tempDirectory, os.path.join(currentFolder, '')) - if os.path.isfile(os.path.join(currentFolder, 'requirements.txt')): - modulesFolder= os.path.join(os.path.join(currentFolder, 'modules'), 'modules') - if not os.path.exists(modulesFolder): - os.makedirs(modulesFolder) - install(modulesFolder, os.path.join(currentFolder, 'requirements.txt')) - if os.path.isfile(os.path.join(os.path.join(currentFolder, 'modules'), 'ContentCenter.py')): # updated and now reload the function try: diff --git a/modules/.gitignore b/modules/.gitignore index 4f78ec2..225fc6f 100644 --- a/modules/.gitignore +++ b/modules/.gitignore @@ -1,2 +1 @@ -/modules /__pycache__ diff --git a/modules/ContentCenter.py b/modules/ContentCenter.py index 215e607..c0552e2 100644 --- a/modules/ContentCenter.py +++ b/modules/ContentCenter.py @@ -12,7 +12,10 @@ module_dir = os.path.abspath(os.path.join(script_dir, "modules")) sys.path.append(module_dir) -import requests +try: + import requests +except: + pass # global set of event handlers to keep them referenced for the duration of the command handlers = [] diff --git a/modules/modules/bin/chardetect.exe b/modules/modules/bin/chardetect.exe new file mode 100644 index 0000000000000000000000000000000000000000..01cb8fc92d381a5f7801182f4a2da6f2888fdeeb GIT binary patch literal 102765 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�?dYNUd4WaURX_A__M4W}D0!0n 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 z zqJfq!|2a@J43Lli?G`g=@b(N1-k$ME=RPmKKV#Ms8pQwL<7R#3r_^4o4S)H2r~k6G z>BK|WoTtOnf(%#>qGjS~p$C8bpus~;I=rn!)4^+Kpe@VqWJ|_( zw(|e#Vh@cK4Wql+o}Jt5b(u3X3=$2hvDuYT_KZ)$o_oj^@JY$?NvzM_Cnc;hYhHza zO~2Fx{1x9%>(HS?yke9o(1Bm1M`xgen1>!(c#pN#$7OuRdP~eed!nF|EuGlO7K?^5 z(Xdc7JbB-6+r2}|Q-}7E=**H#l3AZcgO4#1R#rV+lmGY&um7DpcW!|!JYcWj4Q}A> zX~Fm7@7dSjH(9G#+h{8%CEMeo;jxLGZPEBH78VUP?fK90Nwczg*t8oju&J3nZSwU! zEq_Rw-8t$id*}7_1`W|MhO=k+BwB6w%ilZw7e3R$9lYql3B0if`0QnZkB^RziHD#O z{eNa^cY8`SEEf%rP7n>U1?(9buxEVIee$c&FcTVXxWH~3DjKd!vx!4`IU2x|7=!iM z#~2;7zNvjn|M3~DVZ;%@!i5Vh6bcz}sRu6)`or0Y^0K!6{&ZV2xuZRKvuKblJR%w% zj@UCksc2Mpo0r?&X6K~XJ=v)?V^|NnQ#9Nv8YYQ`38H~kGsgI%Y(wo^{s;V}3r_!~ z*HfV7)?072a5(Jf@ifpMiVkQ(w|KVl=BC(R za#HPX(J);!+#wonksjTgk>(J^C-sPmF&>fKt9{G=gTL4RE?v5`00;2YsgP)PIG0-to&W{rHOB_t%+ph1I7XEThrE-x?7Mvfe5)22;xcCD0;^E<>s zwb26aSsU<4Jr^Ggdx+5RuJ-zXXF*5~LLOd`Xiv8O1^35_qn#Xzi;Jyq-@c}^MRwO+cbRHRcF#TcIDFXO!*6I{EnuBM zuK@Ni(11Th4_OQ0(X)4^*@g$ff3K~3VDvXJhHQZt1AE3N%^7U59J^te0-b4P61bVkv1Cdri3vX(7d znqq5*3wRK3L<2N<@O02K9)M2yvGJ|{ns==|c}uF+=c*Wk^*J=5r!BktdVA}IrM7p^ zo{f@so%0VmOKDT4OxdL~N;YZIq&-(%b(IYpHq7x|`%0%v(12Z#_W?KPs7VVs2-acr zo)`&RAs?|y`$^s-Mq-_SmRg!v@WngG>uB>oj3wJGRF1OZrkid$0G>KG>HwSeG_-2f z%5-+k$$>QkohSD3bbv4Tqw~NKTBVZD*uUXq5smQ zBApj|1v^zm+{TX|@8kdt_*LbWZNPv5?tNqc4IZGu?|a!(5@VzH;7N}TL7Uev-Y2Fa z=9Vw{lX6ez>zv^X_7KN{KY9+GGg-<~~tT54*l>2!*d1E2GZr-9z< zm6wUP6YK-reUBcoXF#ur1CgE2ZwPM2J9{2^~B z`*1X*r>EN`mt5j>OEr0iKfH$L&;s7r0se>g*(0Do#M-N52iO2M!MONf;eJ5lOo@$+ zO_kh>m3OKX($svY>(r&W_`&NS@sH;#_*7I>ID8~qQ*6PhVrLJMw@Kfe4zNbSXYL2M zh6em7JjMSnS+c~+%gfyw`0&FIyXVLeh)N@B>x&+U$A^D8i!sA$Quf{)G|M3yg@~BNF&_#}Y;J|^VbGc5xJ3$U0C!&>(H?2uap3OoXAZyr)!H*1y<`o74r~xU;Xm+otVhu@fwxPSF10yx<~V(Z z-yWbF-NAN~6;KJ!8Sbi%Rn9o%V6z$bcL1b+|E;NfsGVGNy#cH^L9JOgdu zi*Buw?}QeQyW-OY$EfdBSby`^<$q*fZvU(GdkVC`e|k>`y{Cg7p5kAy1pwLb9&*5U zVyDOqUqmf|8Wgm^cg=Aue&!pD4}RtF_xi6`p#^*b4kr`hd*UDHqAmxZTlCL8_nh;) z@Bn*7-@zX{kUl=3>5o@uqA6$sKYjjFexf@60}ZU5#4q?i^nmqCpkj2$hl* z>ndj~j%IBFzazCD=?2aq{7(XNaQ1<78pqwNK#R+&F=O@z8rXr9F=ICC`#C$SdcAVj z-(7!VWW0KjUf+Jvd}_zp`|>HS(&jg4F|HHGt3+Zm|b z@N1ttln#djw4PbNe*KQx+l`P-@57%d=G-HH`;pdyPvn>0RD52nJlPG3fzx#Vxq^7b z8#}I7je|NFxzJSQZ>f1xFMeg0*-OgG>HA2uPj&yH+FA19C7N>|{u3X`ehC}^U&DyR z{0HP$cgg2&l;3=UfvK5NZ=}veeTAGj^`TdHo2?h^b*S~m;ir{XNLTKuKR6IOvG-(s z#ILg!;j4*diBtHD*R-outD@#ft&JKF=NG6^QQx8NPmPUsDB|^g9D4xmL9?}AxPkST zb&Y*4^AbnHlL-ATcB&e&>M!-OtCYK?-bbzM(Vfws*7}+vRpf*pCOM(V{U-jEA?Y)e$o2K zSr%$E)cU9~p^vSfa*yuy^AiX8`XcKpahi|cJT5#zUYT5AiSn7$eDz&AyID3CjRX4F zzlJ{Q{JygZ&eEWdHR^P6%&&S%y7CJBqw!#F^qihXy^R_P^+M`YOaGE{#G2u@FU@i* zRPz)LoaezNsM*py{lpdH#*NF)&(FVs7!>e$kT-!BH1g}zny7J5E2GXteSP*!7sFUSKaA2~26;*Zoftvg6|L{(=4~iqc zLn=8zLSD z4|vYLnmsjnQ}BQn_#-}}QNQIJfVYX-^pX1_x>j2kM~tm}MYi%SS@2=Tj2X`F;dfd8 z@c-xn{6H6(8(e7E#HU+cvF%%4lTFmnN7)4WNULpPum9}F$#am?g~#l#WQ%UUg>8b9 zmrt~8kj39;^|PH@U$GtUz4nbh$|k5^qmOeZ{+{V;UH|11mcmVJNJZj1Y{8+c}9qdar z{P_anyTi3O_MnPCwoyx@E}`$48u?dn7%^gm<2(LW4loyf!P~0ViT$d}TrXYD zQ;c*#lXB+iNPDU{cqQJ?96EI9bJTdq(d!HUhAgPBX=^t?cg`LTy&6JI&}@~13Z213K`%Rcn)0P1%4Z!37)G~ zt(u{UPdn1&`rO&S>bL3o9$kOtW=!M^4*Hz{)9(t{WtUy%a03T`d$0lSLvM(a@E4p* zR4%+oa`LSC_#A2r`pp7YW5zDPj|Lxnj+c0unhJ5dX!xrp zt?S(2=jQkN3||580GN;UNWYQbd;@1yp&gw=Uho>a@yW`)EI7)!-TcfWU*r6LZFu+? zSl>A?ec#dLiir!!IiZioF}Ir^dj0x~E^4%>!Kbd2*moW0QZ0-S$1M!K1s z76<(``5w)GWB}lM@qNfyzX^fj-e3qd_Wpbo%&{+T#E0;K3Y5BYixSV1kn!BX(8@9hQyhiW>j#n`nr>0{6N^XEUR z8qHq$s84k+-)`)Xy)pV)u06;Vit9Mnn4-PaTJNnPO4^8ajVw_#tgUuDr zjKN-O-leO<8M@>ux-uNvVdl>dmkNkOrF-COzST2^F4tWIjZ14{`u?7(b z(N^5r%f(ylKiGS)_aWA0zY+fH?Zz1F!+Q%4_Q3=;rp5#O}oH z>>JoSO~|;=&2dGA*+T7W^*wLP&(C*fM5wDFOZ3I_-`%V~>(?xDasLGEeIgBFAA^5d z7o6XsCdc^!p7lDncw%?kwt1uDCwr({GTr>Uz5bwk_Mj)X6 zP~h+3exNb;)>9%g7>rSWlKaIq{k~*O)fK?$nj;`9b8)p!=1z27#{Wd3hOG*A5#O9Gf*PJFi>(sNC$%d4q>$WToe|$;up@ zJ3MdrbtBsh9-h@XJuj>6=yT(PS?SrC*Jb4S|LWN-{@k|h;=7;PC>ZQIGIvy-`#-mJ z9IbuTb9yo_WAG^bTg-88oS<6Q+>8;UG)u;iez}>W^`988&&aF(F#6+OWA!Ni@${06 z(HX;n!}!}RK0U8b_UPd^X5_{PM`iXHJXrtIvs?Ui>BI6e;=6ZEsvi5`hpWery5n23 zcTGA7*RDy`MC@b){lt&^a_{ou)x~Rz*Xw`$ z>@03ql3aq`vw>MyxV&&};ikgM!hMAei(-osi;|0a7Y!&HS~Rw3YSHYXg+CV!9rGZexP)sN` z6bvPX+J%xssiEGXexU)OYeGXqIiazkg3#2^%+TymVQ67!QD}K+b!cs9eP~l?b7)^E z5N;Tb3CD(m;lyyeaB?^`+&kPaJRp2ccxX5$JT_bqo*JGRo*ga>FAOgVFAuK{uMMvc zZwhY?SB7_n_k{yx4a;K6V#|VMiDm7|lFL%ddY3IP+f=r%EVewkd~Es5^4aBuuq3ghT}i)^ z0VUUz3@yni8Cz0NGPPu8$!u}-`}REt{;zSMd9%Tt2j=7szdkoTYe@RY^nvNw>4S%7 z4@qx7FlXGzp~JJ=W{k~fbZVo17oT|2PaN_s8uYzv&LZn z#x)PNY1JmEe`u}$z1%rCYUFiol6j|5W>(Jd+>ycD4F4)`TwbF_*X0h+3J%u4J0FrU zvhCnunQbGl^)JMOktZ0rQKQW3f`bNS>;Ehd8Wil-EtueEOz5ojG8oigZPRnFAANPZ zKLopJlD2uHu1(BMNNkfgI5#tAC;Y_yn1g<{pcc9vL-eOWk;Fk<=ok4n9rff!JL#jUc>ccuhifdT literal 0 HcmV?d00001 diff --git a/modules/modules/certifi-2018.11.29.dist-info/DESCRIPTION.rst b/modules/modules/certifi-2018.11.29.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..d584ce6 --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/DESCRIPTION.rst @@ -0,0 +1,45 @@ +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/modules/modules/certifi-2018.11.29.dist-info/INSTALLER b/modules/modules/certifi-2018.11.29.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/certifi-2018.11.29.dist-info/LICENSE.txt b/modules/modules/certifi-2018.11.29.dist-info/LICENSE.txt new file mode 100644 index 0000000..802b53f --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/LICENSE.txt @@ -0,0 +1,21 @@ +This packge contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011# +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1# +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/modules/modules/certifi-2018.11.29.dist-info/METADATA b/modules/modules/certifi-2018.11.29.dist-info/METADATA new file mode 100644 index 0000000..165ee1a --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/METADATA @@ -0,0 +1,69 @@ +Metadata-Version: 2.0 +Name: certifi +Version: 2018.11.29 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.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 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/modules/modules/certifi-2018.11.29.dist-info/RECORD b/modules/modules/certifi-2018.11.29.dist-info/RECORD new file mode 100644 index 0000000..5f24f31 --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/RECORD @@ -0,0 +1,15 @@ +certifi-2018.11.29.dist-info/DESCRIPTION.rst,sha256=zHkn1YEe408K2MGitHvHNrp17zRLM4tUVRv_8PJTRKc,1465 +certifi-2018.11.29.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2018.11.29.dist-info/LICENSE.txt,sha256=anCkv2sBABbVmmS4rkrY3H9e8W8ftFPMLs13HFo0ETE,1048 +certifi-2018.11.29.dist-info/METADATA,sha256=NPNIqL3Rn7OYSxKd9-eM_IG52qaoEYXzbLPQYAc7iEo,2408 +certifi-2018.11.29.dist-info/RECORD,, +certifi-2018.11.29.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +certifi-2018.11.29.dist-info/metadata.json,sha256=qQMHCg3rKC0sNjQVdrpaQSXFC6azUQcgV1bA1PB1mLM,1049 +certifi-2018.11.29.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=timLpLv3BNcGLLEz2s6gyA34hOhMb4AIPBz0zxOxna8,52 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/__pycache__/__init__.cpython-36.pyc,, +certifi/__pycache__/__main__.cpython-36.pyc,, +certifi/__pycache__/core.cpython-36.pyc,, +certifi/cacert.pem,sha256=zGy4Y1gu9Zy-6CGvg3apdC7kXMm3f1ELolJwNDnBRv0,275834 +certifi/core.py,sha256=K_VfM6GwSemTFisUgFWyk__w1m9pCGFRF5zTzO5bGv0,288 diff --git a/modules/modules/certifi-2018.11.29.dist-info/WHEEL b/modules/modules/certifi-2018.11.29.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/certifi-2018.11.29.dist-info/metadata.json b/modules/modules/certifi-2018.11.29.dist-info/metadata.json new file mode 100644 index 0000000..aff1843 --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2018.11.29"} \ No newline at end of file diff --git a/modules/modules/certifi-2018.11.29.dist-info/top_level.txt b/modules/modules/certifi-2018.11.29.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/modules/modules/certifi-2018.11.29.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/modules/modules/certifi-2018.4.16.dist-info/DESCRIPTION.rst b/modules/modules/certifi-2018.4.16.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..643a4f9 --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/DESCRIPTION.rst @@ -0,0 +1,48 @@ +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed. To assist in migrating old +code, the function ``certifi.old_where()`` continues to exist as an alias of +``certifi.where()``. Please update your code to use ``certifi.where()`` +instead. ``certifi.old_where()`` will be removed in 2018. + +.. _`Certifi`: http://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/modules/modules/certifi-2018.4.16.dist-info/INSTALLER b/modules/modules/certifi-2018.4.16.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/certifi-2018.4.16.dist-info/LICENSE.txt b/modules/modules/certifi-2018.4.16.dist-info/LICENSE.txt new file mode 100644 index 0000000..802b53f --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/LICENSE.txt @@ -0,0 +1,21 @@ +This packge contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011# +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1# +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/modules/modules/certifi-2018.4.16.dist-info/METADATA b/modules/modules/certifi-2018.4.16.dist-info/METADATA new file mode 100644 index 0000000..b710cd5 --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/METADATA @@ -0,0 +1,71 @@ +Metadata-Version: 2.0 +Name: certifi +Version: 2018.4.16 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: http://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed. To assist in migrating old +code, the function ``certifi.old_where()`` continues to exist as an alias of +``certifi.where()``. Please update your code to use ``certifi.where()`` +instead. ``certifi.old_where()`` will be removed in 2018. + +.. _`Certifi`: http://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/modules/modules/certifi-2018.4.16.dist-info/RECORD b/modules/modules/certifi-2018.4.16.dist-info/RECORD new file mode 100644 index 0000000..5715c92 --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/RECORD @@ -0,0 +1,15 @@ +certifi/__init__.py,sha256=KHDlQtQQTRmOG0TJi12ZIE5WWq2tYHM5ax30EX6UJ04,63 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/cacert.pem,sha256=0lwMLbfi4umzDdOmdLMdrNkgZxw-5y6PCE10PrnJy-k,268839 +certifi/core.py,sha256=xPQDdG_siy5A7BfqGWa7RJhcA61xXEqPiSrw9GNyhHE,836 +certifi-2018.4.16.dist-info/DESCRIPTION.rst,sha256=jXrtxvB2mFIsHbuK8aP8RXrMx5yecyAIMZ2cn8Xb_ro,1679 +certifi-2018.4.16.dist-info/LICENSE.txt,sha256=anCkv2sBABbVmmS4rkrY3H9e8W8ftFPMLs13HFo0ETE,1048 +certifi-2018.4.16.dist-info/METADATA,sha256=uYCLBFPwRU0XfEULiHO8iLo1QELisMwd9CSJ_Bw4DIc,2570 +certifi-2018.4.16.dist-info/RECORD,, +certifi-2018.4.16.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +certifi-2018.4.16.dist-info/metadata.json,sha256=ayQwq1S2ID9f_MxGU0ZEouhzp5UoCwVtNT3ZLM23p7g,1006 +certifi-2018.4.16.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi-2018.4.16.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi/__pycache__/core.cpython-36.pyc,, +certifi/__pycache__/__init__.cpython-36.pyc,, +certifi/__pycache__/__main__.cpython-36.pyc,, diff --git a/modules/modules/certifi-2018.4.16.dist-info/WHEEL b/modules/modules/certifi-2018.4.16.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/certifi-2018.4.16.dist-info/metadata.json b/modules/modules/certifi-2018.4.16.dist-info/metadata.json new file mode 100644 index 0000000..ddab4a7 --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2018.4.16"} \ No newline at end of file diff --git a/modules/modules/certifi-2018.4.16.dist-info/top_level.txt b/modules/modules/certifi-2018.4.16.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/modules/modules/certifi-2018.4.16.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/modules/modules/certifi/__init__.py b/modules/modules/certifi/__init__.py new file mode 100644 index 0000000..ef71f3a --- /dev/null +++ b/modules/modules/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2018.11.29" diff --git a/modules/modules/certifi/__main__.py b/modules/modules/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/modules/modules/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/modules/modules/certifi/__pycache__/__init__.cpython-36.pyc b/modules/modules/certifi/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eddd7bd487a8b9d5187d654eeac49f72b6db458f GIT binary patch literal 229 zcmXr!<>d-vNQ*IHU|@I*#Bjg_WH|tFu?UbzVMt-jVaR2SVq|1UVTxi(VGd@{WO>O5 zl+t9p#af<`T9jJFWn^Gzp=W5QXJqN8$$X0?Ilm~i2xQDH?)dn!)S}|d{Ji-1l?+9! zKrt}!E6~|0CbSqR72}qelo{h#P~ehSk{IKYpPZNz6Ox)+5L1v@pqrUjT#}fRqnlc2 wSXyY5m=}|rT2zvmmI-hyj`ON&};gGfK4fYx*U(t@?#ljS*fr zFD{%jaoye-V(J0F%b-2WxP^fp7>Xbw0upi|1kgfKL1kQI9l*2S<_{jJo%;2EkB1>h3JbqEg_Tm=)a&_sJLL5jp+< literal 0 HcmV?d00001 diff --git a/modules/modules/certifi/__pycache__/core.cpython-36.pyc b/modules/modules/certifi/__pycache__/core.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49210a4dab7542439c0b1f5dfb13cbb402acb877 GIT binary patch literal 490 zcmYk3%}N6?6or$_v>k(e0avpUDzu>PL`12$(r#>Blt74+43j!PX_6uqbu+$0wzR!)&%GgV_;PaI?cyhpk{AN;1NI8J{o1uTal*kAaL7>(r;rCc`~p)X0^WK- z`dEYl)u4tDaP$az?d1d~LR*>2fqKKA+roI9NfQ?pU*saz!Y*`aVw;Irmd3I?XI55a zoL9+usnR%M-f5sjF~GkL1B?={z8o$HTn}BFBPSNj;0)QIh9B!ae0RvTM?#||-dXip z4XR8NDrU2$!=)}+A)1KNROW)xCY)8W?7;@6-#|ys`R`$PK_*6ML+;qKBsWUkGRw%l zBhATJ6pARR`kPnu#r$+JKVv1?q_CTn7A}&e^_mGSx*j}q0^lLi*iFw+Fj-RS5IdCe nDxp;Sf7o7oREOA7T9$SNw!?eh8x=YDe%Nnhk@` literal 0 HcmV?d00001 diff --git a/modules/modules/certifi/cacert.pem b/modules/modules/certifi/cacert.pem new file mode 100644 index 0000000..db68797 --- /dev/null +++ b/modules/modules/certifi/cacert.pem @@ -0,0 +1,4512 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- diff --git a/modules/modules/certifi/core.py b/modules/modules/certifi/core.py new file mode 100644 index 0000000..2d02ea4 --- /dev/null +++ b/modules/modules/certifi/core.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +if __name__ == '__main__': + print(where()) diff --git a/modules/modules/chardet-3.0.4.dist-info/DESCRIPTION.rst b/modules/modules/chardet-3.0.4.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..c0f044d --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/DESCRIPTION.rst @@ -0,0 +1,70 @@ +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/modules/modules/chardet-3.0.4.dist-info/INSTALLER b/modules/modules/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/chardet-3.0.4.dist-info/METADATA b/modules/modules/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 0000000..1427867 --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/METADATA @@ -0,0 +1,96 @@ +Metadata-Version: 2.0 +Name: chardet +Version: 3.0.4 +Summary: Universal encoding detector for Python 2 and 3 +Home-page: https://github.com/chardet/chardet +Author: Daniel Blanchard +Author-email: dan.blanchard@gmail.com +License: LGPL +Keywords: encoding,i18n,xml +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Linguistic + +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/modules/modules/chardet-3.0.4.dist-info/RECORD b/modules/modules/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 0000000..9d16678 --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/RECORD @@ -0,0 +1,91 @@ +../../bin/chardetect.exe,sha256=LJxyiNEAsCnmARU-dDnBgJqRNqNz5Poi9wUaKS6yGNM,102765 +chardet-3.0.4.dist-info/DESCRIPTION.rst,sha256=PQ4sBsMyKFZkjC6QpmbpLn0UtCNyeb-ZqvCGEgyZMGk,2174 +chardet-3.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +chardet-3.0.4.dist-info/METADATA,sha256=RV_2I4B1Z586DL8oVO5Kp7X5bUdQ5EuKAvNoAEF8wSw,3239 +chardet-3.0.4.dist-info/RECORD,, +chardet-3.0.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 +chardet-3.0.4.dist-info/metadata.json,sha256=0htbRM18ujyGZDdfowgAqj6Hq2eQtwzwyhaEveKntgo,1375 +chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 +chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +chardet/__pycache__/__init__.cpython-36.pyc,, +chardet/__pycache__/big5freq.cpython-36.pyc,, +chardet/__pycache__/big5prober.cpython-36.pyc,, +chardet/__pycache__/chardistribution.cpython-36.pyc,, +chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +chardet/__pycache__/charsetprober.cpython-36.pyc,, +chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +chardet/__pycache__/compat.cpython-36.pyc,, +chardet/__pycache__/cp949prober.cpython-36.pyc,, +chardet/__pycache__/enums.cpython-36.pyc,, +chardet/__pycache__/escprober.cpython-36.pyc,, +chardet/__pycache__/escsm.cpython-36.pyc,, +chardet/__pycache__/eucjpprober.cpython-36.pyc,, +chardet/__pycache__/euckrfreq.cpython-36.pyc,, +chardet/__pycache__/euckrprober.cpython-36.pyc,, +chardet/__pycache__/euctwfreq.cpython-36.pyc,, +chardet/__pycache__/euctwprober.cpython-36.pyc,, +chardet/__pycache__/gb2312freq.cpython-36.pyc,, +chardet/__pycache__/gb2312prober.cpython-36.pyc,, +chardet/__pycache__/hebrewprober.cpython-36.pyc,, +chardet/__pycache__/jisfreq.cpython-36.pyc,, +chardet/__pycache__/jpcntx.cpython-36.pyc,, +chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +chardet/__pycache__/langthaimodel.cpython-36.pyc,, +chardet/__pycache__/langturkishmodel.cpython-36.pyc,, +chardet/__pycache__/latin1prober.cpython-36.pyc,, +chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +chardet/__pycache__/mbcssm.cpython-36.pyc,, +chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +chardet/__pycache__/sjisprober.cpython-36.pyc,, +chardet/__pycache__/universaldetector.cpython-36.pyc,, +chardet/__pycache__/utf8prober.cpython-36.pyc,, +chardet/__pycache__/version.cpython-36.pyc,, +chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +chardet/cli/__pycache__/__init__.cpython-36.pyc,, +chardet/cli/__pycache__/chardetect.cpython-36.pyc,, +chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 +chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 diff --git a/modules/modules/chardet-3.0.4.dist-info/WHEEL b/modules/modules/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/chardet-3.0.4.dist-info/entry_points.txt b/modules/modules/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/modules/modules/chardet-3.0.4.dist-info/metadata.json b/modules/modules/chardet-3.0.4.dist-info/metadata.json new file mode 100644 index 0000000..8cdf025 --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Linguistic"], "extensions": {"python.commands": {"wrap_console": {"chardetect": "chardet.cli.chardetect:main"}}, "python.details": {"contacts": [{"email": "dan.blanchard@gmail.com", "name": "Daniel Blanchard", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/chardet/chardet"}}, "python.exports": {"console_scripts": {"chardetect": "chardet.cli.chardetect:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["encoding", "i18n", "xml"], "license": "LGPL", "metadata_version": "2.0", "name": "chardet", "summary": "Universal encoding detector for Python 2 and 3", "test_requires": [{"requires": ["hypothesis", "pytest"]}], "version": "3.0.4"} \ No newline at end of file diff --git a/modules/modules/chardet-3.0.4.dist-info/top_level.txt b/modules/modules/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/modules/modules/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/modules/modules/chardet/__init__.py b/modules/modules/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/__pycache__/__init__.cpython-36.pyc b/modules/modules/chardet/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93b818b9f2b49996d518f5b492badbe59bdcdb00 GIT binary patch literal 816 zcmYjP&u`N(6t?rbfuR--aP*N%tQs2!R3QY~iaIxbpAd!hU% zocNb~<;1_hiRYvpbL5xz?Du{C?DvlL_WTPp2_HHL{YJNj0sbqP)pIZjN^pj99N^pt z46I`#Gjl7jYTwN4+zFiA4P1z=#QuQ-FLBOL*ZqS5-Zhl@@ynq$M_sHs=SBLJiHc?? zOtM&V0SR}aNUx>5h$7`)3_hQ|`*0d-v>sZG1@jnY^%jgoDtb5j7AEPmyEC?=1E#i37^#Q6x0@E zyp)VoQou&fuOa=C3Yym&5p47|4H*JKlgj1`U}8ja!menZ7OdC6WKuCV$r4Wlb1MlpSZhVo)JZW3*)DCEL3FLZSnie?J}f z!}AKt7rvq6G<;o_Csfk#J&$P?4q0A?Wm@jnLb7b1&7UsjhqMUeODcfs<{w3Ak;*9Q zl}qI`XFSpcZ-YUukA3Xmdxi(r$KnC3ox%;BnCB&xLbr%8!Klt+*IzrG&3)W$g9%%w gLc^n)q`tx}b6<0KFLItNGWJp*Q|a6`zKh%DKfuxCY5)KL literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/big5freq.cpython-36.pyc b/modules/modules/chardet/__pycache__/big5freq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc485f506c715d0d1bd3089392b396f698e423df GIT binary patch literal 54703 zcmYh^WxQ5Z)5q}xiU?RpNQiVwcPY{!-GYELNV6$P>F)0C?(XjHlJ4&2KHu}adF~g# z&#W~w|Cw3)0&mW>_dc1v{yK8Ska|^Pwhsxp7V`i97b7I(x6pOV=%J_+QYEBLxGLd> z#HbU#O88KQD;JXDv(Sk8|Cez)&z+Fa)tzvm%R7-GhT>|3P<*l+&Ds^_fU@uf42c$s zrL28W^P5oI{yY>BqJ*NUy_@zDhJ}2^5vqTuxMga{_hl%)V|A0!-*OCr;o(Ek{o7E) z;qCBsD5^yc#UkDw95L-R3{Ac>j_7Q;X;~%Z{>@roj?n#(I|m>qOo|$cp&B2+o5$WT z%i-`#m_X=ocZzXbg2~WGp%#%svBznQ5PVGs(TsIj$QMSaW!}#$L%R*R(^IFLWyG_* zW`t%&$S8P(4*m{}zSE6&KdIWh*|jlJjmg^m+-&dcy%#snfTMT^S$3e(k#z{VQ%=OX zuD>2cf3vJAZM3wV=2$Cj9gOGQ&FU$nD-?1DV+41kQbzG2;zqH?a+J1gBlsb!r$RT3 z8d1o6V-+w=bwfWFH-)#5y-q~8iYq90zMe}7S#Fu$yr+3vT0YZSX2@-s5f;ek#Y(17 z3EoQtp0hfWU%`8gx3FO*SjHCer`#p1apuUQP;9M55nNO8@VvzwQ!3smu0nm*E_+o- zO)yqYX`=;)YKGkDN1&Ji--z=E?@nLVDpquHEA%p6-3yjA2sHNLiq9GVy_{rh8DGmy zK(B@6U>$UZNv3>i?_Z5nu@X{a=TY?}O&6rTazawbSZptb zxGnaYt5JS>>b^8LcLtME(Lnax23h8gTM9)<%r#YsT zitkaam%j>T2&ra{ylSlGIBxGEl?$ zrt091j8X)Ot2RNQc)a!OWzf}iDqSq6>-4z2$uQNCe8I{jBZrVjf*V6>jy)u$WnGQ8_s6A-;1U{7CgULQAEef+@zMq8XO79N6C9CM8^an2CoCKB zHg|nzXuL$20L)PLk|RlK8F~((|G}`F$<$ai~Mgk#S zsC=oR1gxS;-h%Af-LJoil)t0WffZUT^eV{sfz)tmAGEfCqX|4CFvsNeT#uE!AK@P= zTeW+cz#MJN759MDJXS2$W1{ut4%GM#qLHOVBrspx0+?zU%W1q3vRd6_tcASEWh`RF z5jTj`_^@`3l~&v`IOGt&x3^eu36n2joeGoE_*|VPp_16%c9*AsY7I1*SIApw19EC>6nwbn}(Q&yJSP%n`vH@3Glsb%G)cb@qffEk+Br& za)f4u{+Tx0X~CsfrNu4MUq@|ZrJUDZPfe!NRUS~LSs6rasOGq@5;JvJT9BZ9q z4SUOlM3#0$L$ejnYi|Z`6pk;o5eqix;IWcz9A|&69hJ6@UR!(XS)1hEAXS33RYN@q z+;yRrkdHxXnW1a)cGXpX!P_i5!9BtM5KYb7iQWh*eU;27WI2HiN^XSvGB&X`!xmT} zq>zk8yiF8;r}2wA=w+Cj&gC0>U0F};ZIxTgC0nJdl&V#C8l}a>5t5qJCJkNVI4CX~ zWU=flqn++M>b{>2+J~Kx<-g({x^COW<%bTu-*d#}=*s%2#xz}R(@;0dg#^0rW)OGG zxzvJh#l6?xQ~hn1vDlQY?Cs<2%`x2P`7cfS56GRaa(4)R;DovnjRH4xbrWjAP9XyY zuXiq4=oPSB0&6wY*lF~Kj)wV@N-DX#So6j8(ZLA8N$q`audu_ZuE}mh8;7-_@m)$j zld;letfA*stleR=SvDuN$8s2{rk1r?^|jH2R76tuRZDI!qvceS#}s$kFdd{l6x?4g zd+7~ez2O+;#0!{X538OgzYRN6aUF%^v^+;|lR|OCT~?#7?yu|gIV&z4qr6}45{{JK#%X=t@`iLCA+8M`^QaC9}`VS5hx2y8{g+BjxhE-i5>n9KXx$fZ8mBmZVO`f%dICSVP^UTi>m@6J zGnQZI;2`BTkkE3lq1P*UR>(P+Xm6wwf2?E|Bjm7GMB0yPywbr2X&b}ZRj3fXnR?kL z?u_M$uu~J9$g(S`BKkX~-N#|4X8E-yn>m*Va#!(|m63||nm}60qja@T+D7O`?*~m5 zrIJaLUvi{&OtU#sS(YOe4HgR7q~||~o;U9WNGI+~8MO@9TrZo$W^;{Vag39DQSc@B z5B5td%Nt&Qv9z(0KsFO~x0lffPw5RLby?aL%2!xd;f#m{T&j90R+i5}=G z#4**BdtF!C$lqYygj;YM>g%PC+-G56NkfK(M?!eW|q2 zZd_CD60#c}3aKIFiHQj{C_j;Rs7wj6^jpK>fU+cVa4cmZP^Q+#n_S%(}`{jgD`mGL>4uG0$i;u*Rpl>=c1 zOJIrIe`Vx{a^m{yw6=4ZO|OUGETmq^cn$e1uk!vSV;RxfCMwBskJMRdmCZX%$X?cS z=Q7!->x2|{5Ot*Ou=h%Tku+3HZZD$Qp{8YF)yA1}fc|30SkC)KL*EN&Nj@vl54vw< znTu6YwHKBzA&Q0~$;hnuF|FlPcOd1eye;4@sgXjuL0WNpd>G=fzEQk2y`6e_EaW)H zULn1CcX13+{3o*o4rd?lcysLL9mKKUUTqm~4Kqj^n>6&BHs0BrAmgTx=u}p)-gA7* zdMG%ZiE>y@6#O0QgOE5J2h=#BzZrsGY5cX~xt&lQy+osYOUPSwvs<S4G?*0y7=SGdOJ7R*lQr=wNTYYJ;7@d)5&l zNjN4MD;$*)9CZwsUfsa5yF$0@ZFDK>TSkM5@LG+@1VTc8;CW{XE2rQpVTWU)fs{MY zOG2P-n7pBf=p~%AB$g{VrZ})S=3TCM78ygu{YmPmp4;eo6mNLBwOKuQE2>e}yh#+# zMK9DD`Y|K_nYeoPK9lx2obt!Hjv4?|940h-Nw5Y$xf}aVg##FgnLvA-D9hS@$)l#Ndbty$txC)DUTz zO!)&xEXXBesN%6L<3LN^seHGEmvFm5y73aLWXH_jAatu-0GHbBqO!t-Xlea(6Rxpa_T@GOV(PP>;>i|I%{I)eJkwA`jt(Y2 zr=e1C*NGQZvMs63mcv}%>Z*m;^F+Pmq&M4{ej;$$LCmqd!a8fLDRLL;C70m3ax+kw zL|`(^mEk*sJ2#blBjd2;6yCeKKd-A8tPsJaEpyZR1+EGHmDR&o7mbxd<2C4&RWgs< z%C5&$qD6IZO;|6jwUzdN{QSG7_q`UhsZhP1E>bjs;Yj+8ZD^Z`c{g z?dU4Zp!XfU$dHeBy4~S{K-L-vbWE2gOd5BEq7oASe01iO;lc?(DMrY z8U+D9XEb#)?0Ny3F%Jxon>b#h4pd|&XJF( zcoLmfvit-g;%+F^jMNn&Au!y&;oJJyrPO9-Z?80j(vAtVDZbJdBr6EYx#Uvi8bSz67VkJ{Dm$lne(WI37tG$$HFs zCwI0{!;^YquNjpWIssp+Q7{ zgwGW}AoounfgJWC*!u$N$ZbF`yzc8-uAs6(fA=|l=SV2+qiV}^Ur*d|de1c!&m0c~ zFXvqWoVxV>S7e;9u1p>X=r+NAg$X{-lG-+8s)zyWm!; zEfv?Al}>9vliDJrjlE&4`Ho~PmESDea)eiWuTF2kO3K~U$fUJ3x;n4;Ai1fD{v+)w zm8{}&z__r}B@o_Nt9-(;l6t7nM%HHvC6x9h(Y4Ty)FFk+=su^9Pi=Z%8*4R{&!wdy z-;Bx{dp&pyIiWx3jpu!&&|2PlI=#m6jkxw|Ja8oIlw1#61s^lkStUCNNvDlhYOH1@ zH_RfarBDQIoD*EbfD`R)688m1YduGz+{WGl9gHU*k#`;MejR)Uk;QF*rS#V6`MP$~ zTNWfgPaEY(&9cm{+Mm1~b=nCEtFc~gY{T4AEull~%=@Lf8+Z$GR4_+BDifU5ze1wW z>%yw5zm~jP3G{SoH#F2%+K=|Os@7F-B917!ugMWfp(;8}CS;?M?@4tNe3kNWDv`x? zx7Pzs2+3=ydoM^uW94?Cme7l8ZBQ8PuZ^#qw9y6m|O$ zh!J)!VQq-p<)b%8?p)Yo?<;AC6zZ+UQ#k2_<_T%Y>JRfRztq}TX)!6MQKLEJu=ktu z%c{wCmOlu2Cc|CnccR$)LZJ+>jiaAxUyxrwej&u*Sj4Jmm{YvlG`ZVVxF;jCr5~=} z=}LLHYgCMt!Ki!09af_N$6e=qTgFWx3(3cXfus^U&iPtf#v16bw@b@N>PI1q!@456 z-+)!*7J=q6mhkT7t#5B1YqxX$is&>dEyM+eiKweRyhklxnQbY7WiUeBAH#+bS5dV& ztg1#xt@|%6mkYjUZw2cIvt4l-)f5_JgmsFymhq!Py`{zCh^fDo()McOzL4hxV!2wY zII0+W6RAZe>LWKc?+6FB`$#<;WckYdsB@+PHP9mZC2--L>(bL{Uown0U9#UuRy_UA!Y>_Fqa!gI^r4V-j`iT3P)L?}M^ByL; z-U!EJ3==X}S8-W?JB_~dh8kuml^ymb@m`=3h4-3ean=S>mno+dJl!Yka|bq$cd57^ zG+B@LAc1A9jnaNH^mqE}9@d|@{|s2xG7*)$f-@0);0!iNOCuu#<;|8!1kVtXB1{0P z34W&W#H>#;lCU1>D!#f8^?b--C$LPV&@-al2@Es-BpH##9dT-tE$0*XMQe>%TXc|+ zz*g2wZERz0haK=xT0g;K&GyK$yA%HlF55dw{_Vlg4rc4BzOKemDJUe1z5QA{0J{Z$pnTBs z5S%8zSi6tu4dp#!FRR=o9EagYd*OU?4ogd_p?LQ0D*0GfXDz3*{**CNyXWkkha=LK za)j5~3~|Y*)O8yBsT>vZgyXyuKW5p?Y)|bSw`@!_5|vJ-JYnx7oPzd(kGlFl>-4m} zGcc1tT$lT-=5ChPCAx+#R5Cvd@72Nk+txj!o6)vnn4iBt&(ky2{` zfu3+xZW!Ox+>!uoY2*E)=5@*HBPabvo5M}gEz54i8X#%p^cXD9N0S{H-(&* zc8fLFY>PPl6}MMI;T0bPS2#xbfQ;rSXZetoR+HJ~PPTWO)JY}pu-ePb!TSr*GpfyD zjTPL4-Y3E33>}YNOpZCO%oclx1^?qT?$Wyl>6E-;qN~ut+27}gz{(`!fn^rT4_P^N z@ItkDtWOH1a5~NiE8m#&ji1)d>FHp?hQLSQ~B0%u9De=EYQI#%VWH02sCtbUs8z#3x$j^QGU69I{W4hajdeM# zH~D>1`2^<@_l>xRLcV2v2M>e{lDkC*4~!7c@{;q5F8863l#rXsFECh0d{Zvb&_-wf zD@RnK-$OKr4#x%mLirJuanj;zH^~97HShHC_6Zl=p>vC^E1&)LC;t=@B z2)9*hA}#@`f;x!H`y<4ILi+oORhad)v_@1`=((xf7pg6HE_ED9e8C@FsCZ6125XXx zCzdz$Qpo2%p^^y%Pcd7d``bgE=IQw@yn}6qPNdT@ys5=S zH^&P#^6T%m^J{G{pjW_N8Z}m`n?}ZbQpNS$MqCGR51myAeNgwgWfT`Qt#If^9x;?`#8LO~%OF6LC&LBQVVtd0JT?SI6dCTfxC6uvz z%P~&e4h^L=!XqWmDD;b-b142!Tw}@$RXa)GoQpSArv)8TIReux8?io$t4eRIc9)Y{ z&9O>wJC2-`7m3To$_<5hlM4RD@`D;>bsA4@h_qih>R2XMEj58W_Uh^?iD3roG^3s~ zK^h_NS^Ic1vwkvQ3IgTG|3)A$p#F?(s^WCr}A*sD>VSj|A)sr!w-ZINi zme15^rT7&CmY`P>t`Y4aZa^j^p$A&s-<*ek~>57&vNh69?cV6PhGimU@+$LU~;JBT!L6N+1Atn#|5s?*Fy ztt8`}j0iqve^^$ADzM&R|H=AQyKSW{r1#Q+ZI!W$<7bZQVYA8jUE@cU{L5YvAs;QP zlIkOEr|x608uO+lT8+1cj765!E&qZRdQKXqLcWH*nh?u?-%+{3yHVY&&c41;D@dy) zt~S&OOC!HYTnj`0BlnHCy1d~yY8j@Tc9&DB$I-yDewYQXjQ>V2$#w9zy{}BPSmSr} z@~>uTPyjVV~IKHNUICGP1KU3m=V(P zHj|spVSmt2GTw3e`<<1Yqq&e4@V9mwLOptKbZ}R2eai@}L8g4F=M+Ym3pKPG5NHV# zC{KjX2t?FwZmks(*C2H=q+Jako8svX*k}o+R7--JD2iW6TRnHMtP{XDNtConlO;#Ga0Q+^Z|Ma*=nzx z?u%LeL-})3?O5&MgXMgkR&??HGvzW}l_L5`ZU(2ZnqwQi4$|HVKB&-iM^Z?W?F4Uu z94=WEdrzcwl+g(~Lm@|ZNbYilZfNZ!z40<~${lX3&p0CJFP>g9YGaqZiO%I;Qq5UY z?d6hIn7}N-AEkX^*}%u5i{P&Ci6g$WY)W3&{R(Y#gjQ=pm#hoKh%-p|i7As#a1+Bm$oi$VA|tcE3@)6mM=5ea^dH zZZA^hU8o55Dv|0Uqc_J${jH+hQ%DNucU9UH=p!Tp?|qZ^wd@D|VWQv{8o!}sy$R>&??Jj{mu*z(0i2m(TG=#oN4yU}FKrf<$ z2z(S*hH^31SG@fMAJsu}d#lZ{&E9lru{8dlWe$2@Dn6LhHQX)GgVSXY#PmGO(KmEXL{9nL3>Z{_%vBeLAM z998H|WsM*;5>`8*CPbUUCv|t2t(F=wS$7ngsQW06xCQw$FEKM%+B!Z}j|!YTw$cZLg)cg!X1in+4zT7UAs$adgmD-4XO=3z-A? zbyWabQTf6_%$G5jcOJ}#1@I4nubt^Puz_eg81GZ^t-bFcixZ0ABr_YPHRaeYPoT*K zEn1Me2rR)|QYqrFYeC6^95S>~{8VwfUIcDA=oMtfsTRC2m`TgvDrWIJyO-W{x+ z@VPlQXmXcjbiFhYyxZ~wfuaW7W4RapRj8SaFVxrmD}D5aer$(r!zQA^bE%l))exCsN^NO ziFM50b5>cG@u;|Cu*3&5mKxzrw43)hM5Q&}LSsEK~Ex7qoX7xx>zxJvG`JVURC+_O5}sL*dR zzK61g>B-v*?$c`}ZVSCw#yU&jcXJeVea~5b6!O?1zT}84?xbNxa#T=vEcqtzqh8KS z+e);9vAQdC!CntmL>akwE3$g)C7!egVFR-I*vl2mr19u@Y$35147$D>UtCBMvXxY;U+kMs^a_k`g&|Yju zmxRC?6D4KE)7m3(*L6RLz+=l~yw#};ws%kNpHw!&6Cufk{6t_c?>MIs-}1J!A=37- zQiw~yu~RRf`RHX7T$R-CKAqobsJU}#PO2$KR1LM}Xu*+^%2RbW@s@Hef8|{xZZs>E zkUt#6P{p4KekAy3j^|;yq*7a+lkvjdWmjvhANodM9thewE-opn-E4YAmKUz+5IKNYA$x5t)VHzI}2UNSln@!In>@ASH zMQiCuwPp2`+tI0o@cs*H;gcF`I1=e9v&K6*wbZ;JF+&j!j#!Q)|5(T<)@TUNJBIZc zD-Nm8S!3b0SZlwL$|&s%0v%m| zm&R%@E~33JVFkxH#q-KYuJQ3}L$OUm6y>R$pO zYD6>JI*mUeutf*Yv>Q&f3C23ln}t9Q-lPP+CAv>*`=OXN%Fz3cF4YeWvr^csCo2XT)uGNcM{gyYB~qna8A?EN4v7F4&_Oh#F8 zku0~FvY@!wLZT`jhgHa4cyY;1xxyTOIPti=g?WEul@l@z;#rnwmDSKsmf4-@KZZW3 zZX*Kac&EB<fF9)fFLWWV96V{8|S>jS?@>^DMdx^v) zh9r;_{xa`Yb0o9;ot2Ylg|LRy=p^?mN0O4>a5W-J%Ox&1M6oQW`=6b2a#9t}nFcr)qXSHUMa=Bk#*G6m71q*4n`12xobp}%Q5t!ep{ z!?_7@;A@RPr;?IDD)>X8Y0my<%VFY5Ii@Q<_mz25bEJXkl+&_iu+p)%6Fn~@y=7Xx zY*%BSUS^8Rz%kAl{I2IfMn-#?APL8hI>>A}OGXw}R>%fN46~7FE!H!^PaIf(=;Uyw z+p8z!n!REQ9di{fkiQ7Mh0K8LM5~xB2kW5VoVq&1I;uu(I2`5>GTwmS2+3vHlJz^O z-&~I);+|W!3JZaaN~UufxnI(iv+6@`?EL#&T zA?=lreJ<2k-q{Z9n2=v(#3TQw*m&DXdwImo6!(?1;}FI2H;%l}Mzwsb z{7{wN4ox;BFyANkPXnHiTOSIDD+m|#H%@DXEI%_~K5fj=X<>UOWz4lKVtHR{DP)|b zTtd6~Wi$|Xz%dmSSCZp**0=gA#wrf;NX>^5mPf^9aGV*Tq`k2|&kKaqQKOW-Iwq>9 zzXGb&(8d_v#7bsyB&EewGkzIXL2*rW`n~Z_30X*V5mXmfR@`5#LW0X#HW&A|VIDib z^7bmgJRN+^Fn}QF@id{m%MFZZ@a!gN!fXgzK9|f2W9MrqYP@g}7Rz zst`!yn3icMmbA1oYV$6)_ot9PdJY_WE}}cauBy6Oh!$u4;d+eZO~Cp}#xB-y@>Qu+ zgOzHmpqy21Qe#!;_$$oIaaMnwp@zN2dTys=P0RMi@2tt=&Tpq>Esi|;TWwj}G8_3i ztY~V?)7o4O)wQ=uq4q>Ca-1Ml!W{K@>q9y<8n8OLmaAp_M!t^2d2R1Y%fE$`lsiKQ z*A2KvaCRNk6EeaXyya~uxDl)sQc7BBn92K}{u=W(f!~}#Q&tXATbyY#%NbhRYI#!Q zm&D~ZOiNw;pk!4;m!X_i@v^LvYWxPLo#{FqG^ZDzKsg~DsI;)Ro;R=Hy#!7x`Bq$f zHJ(Cw8Q+i^AY_A#jgV8jn^;GkMnLb3xR$Knv{s2;E^)2wwT7AY+OXQfKhO?3>S{B+ zEznn2>y&KIyOVbpWHNafN3xvvisNhoYdG>khcG>uZ@JAOZYA2uUMb3D3GAk~RBnB7 z-*Nm1oyAo#{w8z$YuN?5LO19RXADzS8%<2!!(Jz%+f>VK@;`)Zw>+(loZ4f z*&F)6w^Virt}Lyuy`7f*Sn2KUvfK?jeW+*I`$eHMMEi>y00W`8v39{A%fT=N8rU1k z8U}ml{cZ18QolNq;T-9lMjm?=d=5s~8wodrjAG66d8zASRv&F|7-c1y2qVv7t7f&PRMvTti}Y^UfoY*?PHyF5R)v= z%4n~@3PkJcWim%aqn@(YOz|o9`WZE=+~)RLsXLWp8cc_Uq~3`;qWC#+c{O>R-tUg2 zqGM{HP!+|u(>twDC64|2n?Y(O%nC)x6d|GioDD*cE+hz*4{@hmND%rbDkKQ)AjHEC zA^uhl2|}ep{9Hc7eE=c;pIb-}+CfMVDjyPrmJA6(dkG0b3x)VbA|&u0t|0VY?2sU| zM2J73A;Aw23t~eYhzlMT4B~-zs|0R13lcy=NCb%?2_%JNkQ`D#N=OAiLuyC^X(1h? zhYXMrGJ(5Cf-H~~vVmJJgB*|(azSozS8(7#*B}r426-VLGr6TksF%pdEO!Cg=bip%Zk5f1wL>g>KLtdO%O;1-+pU z^o4%V9|pic7zBf12n>Z`FdRm}NEij9VGN9gaWEbxz(kk?lVJ)>g=sJyX249C1+!re z%!PR{9~QtuSOkk<2`q(WupCyvN>~M}VGXQ>b+8^bz(&{vn_&xVg>A4McEC>91-oGn z?1g=>9}d7lI0T2`2polDa2!s+NjL?k;S8LGb8sFmz(u$O|G{Or0$1T0T!$NQ6K=t6 zxC3|L9^8iq@DLusV|W5j;Tb%K7w{5Z!E1N}Z{Z!hhY#=(K0!#hPm?Ur-n7L49Zde?voP1dYM} zu?w0)GiVMiz)k)^OK1hHp$)W!f1n+-hYrvYIzean7rH=K=my=P2lRwq&>Q+dU+4$@ zVE_z-K`b+`dH;TGJ6J8&27 z!F_lD58)9!h9~e8p22f?0WaYdyoNXM7T&>o_y8Z_6NH2hMK}l#UKAbpzB=&qUEoXb zAR>GTksvZe0Y6X-z6Ljq1>b_l`-7<9%hbS6;)Cem=TAXQ@K9zD3u1#GMh0==NARFc z;QQOazW{>-kPy5>F7Tvm;9J5VDI^2;tp;wi4E*2!AQgBELXaA~Js@z~eUJ{)Lk7qQ znIJP{0k01UvO#vp0Xf0#?}69a2A+=%+;J7S?NHJ~Qcg4$3A>OwuJ z5AJ*l{)UFo2pWU$tAnP{44Oj=@DGNdCA5Op&<5JVKhO@^gKu5~Ki~*DL1*|ExtO?IgiWv+w!l`{ z2HRl=?1Wvg8}`6n*a!RJ033uva2SrjQ8)(2;RKw7Q*av2z*#s4=ivfegiG)rT!t%f z6|TW`xB)le7TktAa2M{ueRu#5;SoHBC-4-W!E<;4FX0uuhBxpQ-obnL03YEKgnSl? za1b7RfgX4RMGyh}3^RxbUqU2^3{l`K@ZfgfQOCf0EQ0SKDtr&oAUec=nD7I{g4hrT z;)2&*2Jzr0@Z+)|0VD*sQU-n$9VCIIkPMQ8+j|3dM+T|jXYkIRAPuC2bdVl0Kt{*} znIQ{g1wY^ovO^BY3ArFQ`~ts%8^i)XJPh(eKFALRpdb{2!cYW?g8OEIVo)4PKuIVC zrJ)Rzg>q0HDnLc31ioAhDnk|c6RJWrs1AQY4e8-PF3=UaL3ii@J)sx$hCa|2 z`aypf00UtV42B^v6o$cY7y%<;6pV&3Fc!wac$feaVG>M+DKHhL!E~4bGhr6YhB+`7 z=D~be01IIeEQTep6qdnqSOF_x6|9Ceuol+Ade{IPVH0eIEwB}~!FJdIJ7E{>hCQ$s z_Q8HQ00-d^9EKxs6pq1hH~}Z&6r6@La2C$NdAI-<;S&4@m*EOrg==sfZoo~r1-Ic2 z+=Y8^A0EI%cm$8(2|R^o@El&iOLzsZ;SIcnckmuQz(@E5-qjMgK{f~vo)`?=HW@^K zFCZd#)lU!!B107LjCa)6g!1ip|8a>Fn1E93!Bc?WqRALNGuP!I}1Vel@1peVSdF(?Mbp#->}Bk)Cg zP#VfWSttkPp#r$ICa45|KxL=`e?nEL2G!v&r~x&>vtU7Or~`GO9@K{h;I`ACAvA)< z&;*)7GiVMiz>kT8me2}XLmOxdZo3cKL3`)`9ibC+2KWC2U7#y;gYM7+dO|Pg4Sk?5 z^n?B|00zP!7z{&TC=7$)Fak!xC>RZ6U@VM-@h|}X2L9(4Rc^F z%!B!`02aa`SPV;GDJ+BKumV=XDp(C`U@feJ^{@dp!Y0@ZTVN|}gYB>bcET>$4SQfO z?1TMq01m<-I1ESNC>(?1Z~{)kDL4&h;4GYj^Kbz!!X@|*F2fbL3fJH|+<=>K3vR<5 zxC{5-K0JVj@CY8m6L<>G;5od2m+%T+!y9-D@8CUrfRFGALL!7B9Qe(8fnQP(_$>lK z1n_dmz_WRQ@4ACX5E(p+9e6k>@JvVW4SWmVK~(r2qCs?s0lsJte0LuB5SV;7Q=7*&rpPf}bHZq=B@M4$?ygaGPl0rlKG- zWPz-Z4YGrqgoB)r3%rLb_yvB2Jm5tHfhTnWPaOoF7YGVKK_~=;p$NFyK5!>hPz;Jg z2`C93_zOxy87K?opgdH7icksMDHl|RD)1*%g=$b8JTem0fSOPXYC|2U3-zErG=RUM zAvA)<&;*)7GiVMiz&B(;OK1hHp$)W!f1n+-hYrvYIzeY}zhck@x&m=6nJAuNK$umqOEGFT2PU?r@A)vyNE!a7(F8(<@Bg3Yi6w!${p4m)5c?1J5} z2lm1~*bfKbARL0ja0HIRF*pt<;3S-a({KjP!Z|n(7vLgXg8$$$T!E`_4X(otxCyu5 zHr#=`a1ZXo19%9J;4wUbr|=A(!wYx`ui!Pjfw%Au-opp@2%o@>&4Jru1HS|`_zXUW z2=E0&gfAfyM20Bv6?l6^;IX5?Z^Z~aco(?6Jop}>fg9a|7~r+pfj7nm9>EJd=oQ3) zxbP!*DM#S_3PF5G013hSK?Cn92t0%zBn6KJ1nyN1+%FcSgjDb|xEVWe-%;S^lpr0X zhYXMrGC^kW#O%wg8yZ3*XberDDKvxT&;r~X5VV9=&>Gr6TlfdsL3`)`9ibC+2Dj4( zU7#y;gYM7+dO|Pg4Sk?5^n?B|00zP!7z{&TC=7$)Fak!xC>RZ6U@VM-@h|}X2L9(4Rc^F%!B!`02aa`SPV;GDJ+BKumV=XDp(C`U@feJ^{@dp!Y0@Z zTVN|}gYB>bcET>$4SQfO?1TMq01m<-I1ESNC>(?1Z~{)kDL4&h;4GYj^Kbz!!X@|* zF2fbL3fJH|+<=>K3vR<5xC{5-K0JVj@CY8m6L<>G;5od2m+%T+!y9-D@8CUrfRFGA zLL!DD9E69@zzd-Q?+^(*;~IEKF>nuF5D6kf6!7~F0xwGpyZ|upHom|cJc6k3JwyZV zvX%2lrE35tPx!-5h}5=ud7Co=5?VoPXajBGA8;Fg;7-z@ z19XH=&>8-PF3=UaL3ii@J)sx$hCa|2`aypf00UtV42B^v6o$cY7y%<;6pV&3Fc!wa zc$feaVG>M+DKHhL!E~4bGhr6YhB+`7=D~be01IIeEQTep6qdnqSOF_x6|9Ceuol+A zde{IPVH0eIEwB}~!FJdIJ7E{>hCQ$s_Q8HQ00-d^9EKxs6pq1hH~}Z&6r6@La2C$N zdAI-<;S&4@m*EOrg==sfZoo~r1-Ic2+=Y8^A0EI%cm$8(2|R^o@El&iOLzsZ;SIcn zckmuQz(@E5UVj#NzgFOtJAqf81fN3$_yQurmk=t2GPMURtWs&gTVXY18>a;JT)13_AQ7DZhQ^m!A}q$5$mEUbYr^(^23h6@fd!1NS)x z?q3e_L4GIz1)&fWh9XcDeh06^2|Rlgc!(o#%XCl*N<$ea3+13ZRDg<53I2e}PzC;k zs!$EQ>>%)XdQbyuLM^Bbb)YWPgZj__{)UFo2pU5ZXbR1sIkW(`ga$346|{yn&=&rI zcF-O=Ku7SdmO;Du>HEbua#!24DLFV+Y=_7-?zEBFcGLjp($i6Ai~fuxWO zl0yne38~;`NDbZs9e9OkkPgy=H;e>cQW0c=%;5Q^z|H4DHpmV+ASdL4-0%zh3VGl+ z$P4)(KNNt1PzVY`5%6w?z=Lu@F(?itpd^%n(ohD*U@pvq`LF;M!Xj7CS+4QpU6 ztb_Hi0XD)W*bG}>D{O=9umg6&F4zrwU@z>0{cr#d!XY>eN8l(NgX3@lPQocT4QJpi zoP+al0WQKN_zy0_6}Sr5;5yuZn{W$m!yUK__uxJ}fQRr19>WuO3eVs*}!X0123!! zytF3pB8R{;!huKnf@F{!Qb0;b1wTV-NCRmh9i)d0kP$LLX2=3rAsb|e9FP-oL2mHM zlfcU{f;`|Uvmh_zgZxkc3PK?$3`L+Q{0_ySIFx{rPzp*z87K?opgdH7icksufXYw> zJboK^7%!*>)!{Fw0X3l()P_1x7wSQMXaIjhLudqzp$RmFX3!j3fCqtsme2}XLmOxd z9>NMdW)-xD4$u)gL1*|ExtO?IgiWv+w!l`{2HRl=?1Wvg8}`6n*a!RJ033uva2SrjQ8)(2;RKw7 zQ*av2z*#s4=ivfegiG)rT!t%f6|TW`xB)le7TktAa2M{ueRu#5;SoHBC-4-W!E<;4 zFX0uuhBxpQ-obnL03YGg|Ju8&COZpl4WmGC3o(LQfZ!h7;sgTmKm_9MGaexB?(XjH z?(XjH?k*=|pQ`g4&c&`(HC9(w*Sh#F)>Y5vgYX zQf;J!1YC$Pg>pz}gM@%YIL!{%*5T4PTyVz6_ynKgGo-@j_yS+zD}0S_@GZW>_xJ%n zA~n(=Ez%)9G9V+wvO{D#G<8EGq;IBE?i zs^Q8p@*zL|#9t_Yf+&Q-D1xFWhT4JD1)*nhw`X^il_uPkWm>`P!-is9W_uB zwV?173PGVy5f014g=y49J=8}7G(;mbMiVqeGc-pFv_vbkMjNz6JG4g!bVMg~Mi+EN zH*`l2^h7W8Mj!M=KlH}{48$M|#t;m}Fbu~CjKnC6#u$vnIE=>xOvEHi#uQA&G)%_~ z%)~6r#vIJWJj}-eEW{!##u6;WGAzdmti&p;#u}`}I;_VAY{VvP#ujYFHf+ZZ?8GkY z#vbg&KJ3Q<9K<0U#t|IFF&xJUoWv=d#u=Q&Ih@A@T*M_@#uZ$}HC)FH+{7*1#vMqA z#@$1ZyZA{cFqHg4jW0C#LdGo~g5p}}tcA{6C_9DzO=!u4AWBGa#8XIw#7KgqNQS48 z9M9lcJcsA;0$#*Rcp0zYRlJ52cpY!xO{9bwn=p|QrYz!J*m4MK4Ph}L^zcKsJXEDa z(>cVCLw+>$K|>2Kguz1RD)ga34<^2W0786+@9_hEL~5i#TBJjIWI#szgiQDuzaTSy z#c#-htjLD!$bp>5h1~cZe;^O?A|LYOPneaA0w{<=D2yT~iee~^5-5pMD2*~Gi*hKB z3aE%ma04EdQ3X{|4b`C+5}F#Jff1??A+it(1yLJyP#5)39}UnDjnEiP&=k$k94*ii ztvC9|JHDgD@CFFciZu93wCiqc9p{ zFc#x59uqJTlQ0=mFcs4<9WyW!voITTFccQ7~>7O3J!q(&N~MLMKM24uuf$b_Hq z3o_$Z{Dv&ZifqV^9LR}W$c^8jM;SVaA%_@xdm)z>dUhdT7cy?4h87xVp%@lwULnC1 z(pn*?6(t}r6~as*kQ6dTp$in+Dj^jTY8_D#l^}l+l~Dy%Q4Q5m12s_#f8!tgi`uAz zx~PZxXn=-jgvMxsrf7!dXn~e!h1O_;wrGd;=zxysgwE)KuIPsD=z*T-h2H3czUYVk z7=VEoguxhsp%{kY7=e)(h0z#;u^5N(n1G3xgvpqKshEc8n1Pv?h1r;cxtNFfSb&9C zgvD5brC5gLSb>#Th1FPtwOEJs*no}Lgw5E3t=NX`*nyqch27YLz1WBSIDmsVgu^(3 zqd11+IDwNmh0{2Lvp9$IxPXhegv+>stGI^ixPhCvh1`Rbr;rGVkpxMR3{N9DY{G{z_Aq=Mwu!?~a2UT0yQ5*TF45^^@9vbf<)*e#ip~W3)%%Qg&V#T2_ z98#?zvKqRnp#>VMo1w57QkkKR84{SG_ZUizA$=IKgrUY48h4>*7vgOp*%ks*Arckh zMIlNQB0`ZHzvB<&L0;rTe*B5QPyhu{2!&AuMNtgJQ354V3Z+p7Wl;|0Q2`ZE3CcfF z8C6gf)leNZP!qNAH~zuDsEsj0T_ru7>pqpieVUz5g3V47>zL)i*Xo_37CjUn2afy zifNdR8JLM#n2kA@i+Pxj1z3nhSd1lDie*@i6@BR0g*B|Od=<8o!YERhI0~ykVQeN0%Y;RjFx(P0Ou}+W7zznPAz>;a zY(qpwSVIWO{7@zj`R|a74gu&;at`(6P&*Et;?M>T3E)uw4ei~~$_+`}kgE+<+K_Jz zozoB}4T;Xs-wf%^P`?aS%h00?*~ySs4AHm{hzn)5P)&CfiG(&T=KufejYqUXIv_pGzKu2^! zXLLbVbVGOaKu`2SZ}dT5^h19Pz(5SbU<|=f48w4Yz(|b3XpF&FjKg?Lz(h>KWK6+S zOv7}{z)Z}-Y|O!2%)@*vz(Op-Vl2T@EW>iFz)GybYOKLptiyV2z(#DsW^BP$Y{Pc! zz)tMKZtTHc?8AN>z(E|sVI09x9K&&(z)76KX`I1XoWprsz(ribWn95kT*GzTz)jr3 zZQOyW$*?0C_VgkF%(R8^v#?1PR>#8NSQrfpJ6mB1D(ohOp`S4H6PA6#vQL=p31c{6 z!6uTz^hp>L3G*OfOd~91gb9eS^biIe!gNBIKM11-Vc;P2|3hv+Qb0#OS~WybLuxd1L_<!q4~xnei)rLl$I3He^Q*>Y^U%qX8PC5gMZjnxYw+qXk-`6{x}qDpqX&AT7kZ-) z`l28DV*mzX5C&rihGH0oV+2NG6h>nV#$p`CV*(~(5+-8`reYeVV+Lko7G`4(=3*Y^ zV*wUo5f)F$ zVIn1rn}k7;uq6_fLBdQ&7}E%Y7-8Nb%v*##hOnd%mJh5z;L73h!v4uRVc zvyDHH2YHbX`SBp)s1EDVm`xVVK??* zFZN+S4&WdT;V_QiD30McPT(X?;WW5%~$@e?xPXZ(W9_!Yk)3$h{`vLgp_A{TPwcl?1o$cuc)k3aDj3ZNhgp)iV| zD2kytN}wc4p)|^%EXtugDxe}NLFGFtqYA2`8mglPYN8hY#y|KMwNVFkQ4jUe01eRy zjnM>6(G1Pe0xi)Btx01L4Qi?IYtu?)+x z0xPi!tFZ=au@3980UNOio3RC3u?^d?13R$`yRip*u@C!k00(ghhj9c)aSX?C0w-|_ zr*Q^naSrEk0T*!zmvIGGaShjT12=ICw{ZveB)QAIxDN?%KOVq?cnA;U5j={=@Hn2p zlSqiCkO+y91WAz$Pa`>=!LxV{&*KHWh?np(Ucsw)4Jq(C-oTqkiMQ}J-od+g5AWjx ze29MculNmF zkQLdG9XXH_xsV&b;}7IPUgSf5{E5F%00mJ9g;4}WQ4GaV0wqxjrBMcDQ4Zx%0TodR z1`eV!s-P;Wp*m`yCTiht{DXf{8+A|@^-v!T&=8H#7){U=&Cnbz&=RfC8g0-P?a&?_ z&=H-`8C}p7-OwF9&=bAT8-36h{m>r+Fc5<<7(*}=!!R5pFcPCM8e=dP<1ii*FcFh5 z8B;J7(=Z(~FcY&d8*?xh^DrL^un>!|7)!7e%di|PuoA1V8f&l?>#!ahuo0WE8C$Rw z+prxwuoJtm8+))9`>-Dea1e)Z7)Njv$8a1ca1y6*8fS18=Wreua1obq8CP%>*Ki#- za1*z18+UL|(!1P?`;Y+l;{iN~hwv~S!J~K#kK+kEiG+9xiI5mckQB-AG?L>PJd5Y> zJYK+ycnL4#6}*bqkOHsc4ZMkzcnfdi9lVS8@IF4khxiB|;}d*}&yWhA;|qL=ukba# z!MFGh-{S}Th}1}fv`B~a$bgLa37POSenDpZir?!849l?sE3pczu?B0g4(qW28?gzSu?1VP4coB;JFyG9u?Ksx5BqTd2XP38 zaRf(k499T-Cvgg=aRz5`4(D+J7jX%faRpa#4cBo4H*pKMaR>H~-cGRnn)2*)yfdl`~V8-wI?;efMp9!vFn))M+xOFOVZs-t^m(|K}HJe@dOb zK+Y@$GGtGmtw5IS>C$H(cK7@9?q~jo>)FzNoj+IQVo^DNhC+o)!`EwR4S22IZQWf7XRlahSLS@UoU#!x{RV#f`sC@n+B@0E-Vpaa{y>O`#sftIj tN*`3Lx&7g9%T*{^wQRBP-@W^v+m)5c?@w@lf_v`$@9V!$;Q#9r_#b$sO4k4Y literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/big5prober.cpython-36.pyc b/modules/modules/chardet/__pycache__/big5prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d7570f34111f58edf23172b34b1af18b4273db1 GIT binary patch literal 1092 zcmah|%Wl&^6rJ%aZj=;g#bdz=R*`5W9^D{>XcMTAnt~KyVObhYJk!+G*l}mZi&WjE zQon^?vc!rNzrc!n$9;qiOf)mc_r~{e&h^WFzx$0Gr9UDR@7Ug0Oc!@dfNFbN$FR8(}54ki0Ugd(~iB9e6JC$Z>E$RPejA=H3255~2!`QF0H z;W5_}X+P`vRBG^S4Cf**XA{e<9P{irFC|zX?d7wbQEsfxr?t)Jda2N@)|S^gC=uK-ArP(c#!k{nS%g?AArz6^vff(x>wNeI|g3^=+Z0ZFjp zPSeHIZFw11j|*>%joUnf!xBr+$?FLTS7#(+9R+gj#$V5ZQhLvvrObk8`pe|pZ<0}0kiz==1YAY{|4QTbj17+xd$xx_ci^$0il}Nu@x4Ea|$gK4K)n z4apM#2B#&ay{H#B8_v<4VtUnntB^*1nvHgPKvye^_A7F;)!cR3u8dMUT@gevFlsn@ ZF7$0BEplSSZ`$_WKE`5D{vLHd{|{No2}=L~ literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/chardistribution.cpython-36.pyc b/modules/modules/chardet/__pycache__/chardistribution.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f969a23ebe70078376f2febf57e5a28ece3c6d18 GIT binary patch literal 6288 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 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/codingstatemachine.cpython-36.pyc b/modules/modules/chardet/__pycache__/codingstatemachine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5559aaa4299c371eed38993a34535b4a2e609807 GIT binary patch literal 2856 zcma)8%Wm676djU!(6X$iNsA^(AJa_{p^1<-ivU5yLp&DQNEui(=iv5*f#E!( zVLsLBD9LALzEfo6(i|I(R$e=Ft++tDx5NT;2K%d4T}ZSrA7a`nt&Al~1(wciey5`3 zLCXQ{?mgPsD0Ep8}RSc6c@k4mzmQj{+1hZ0^WRyWHmv&AXVJ}00VOpK#JO_qGn8qYXlSOj! z*W(098AE|M&#ZuGmWU=7FTz!+PKslR%Tzd*DuK*!A|{iGk_pud3?-DSkk-70VYqn_ zj)JNLpVRtuXXn?QirG@|bHsj#Q)rYfwZCYJua>E!cv+syXx4>t87o7MU5KqDZ3+3L zs%=M-dK0HJBpES#8LryJhdQ5-3I@rdVF7jMh9Dd&ChNJav5%9FF1k~DjArhlJMm6f zgcBFN=Xzf7m+`b1bUc%H{19qg&ebTCb(cajX&()5lx{BCymy~qaS z4AN$KcZaNVX?{rerpM$+k|j2Z?h`$2bj)kae{JvW&C6$gui6n4DRj|&!7xEsc0eqG zSFq=8cLN<@w5YptN{4vvdKzEEGC&ul{+M33(EWsFoOs^b>ubzAo)+rTca*@Lx??;* zIcR$WD&Ju5e7t$qKM4Nt^<9a#sOIJa%=>68s?!QLR=dGI!RTk~UEtp9n5T8fk`q>A z2Q}Hak1!nqeT$ph#b%reVSqj^tLRwJ@!HVzir=B$ z>v(U!SVQb`=ZdnVu49+HB4$cWz0$$8Iu_TE>8=FuIf#f76vc1YUg`SH8uM$mtoX6W zu-4oUQrT5!QKMQyN)eaqGpo4n;9Uun>_qb-*gfagxBunVntlJ*w=l&Yh?y9D*gyRh z+<3Kc#a~-^71DNhQ*UBz(TeCinx%A(w4>;7Cerz-(u^XR$5Et7e^*xeCOv&l-IugC zoa%h4v^{pF&!y2Kmo(MZ*Jy@HHT<;Zg<%+k9kjsBb?bVApz11{O-xzijeP$A|JL06 UI?y8gp>+92a>bB|&~FF-0(#&AbpQYW literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/compat.cpython-36.pyc b/modules/modules/chardet/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98e1157664f1e7993e800237f1128e87832e9010 GIT binary patch literal 332 zcmYj}&q~BF5Qmed|908Ei1-Zlu!6fc5mA&qi3+ZQAyCq0iq$sFCaKs*@|AM+w6EaF zR1Z4Cd^7w8zSVp_eMA+LAwr+%UlD(w`!OQ~61YJW0eZnAdPVwB5E_V(5(pux0vba^ z6S?n`z<&s&5dNegO$5G2S-kTWbh8_+n{^iGz#kfWWD`fsVBG8tw5dCp*RtvyxqDiU zSox>bF6m`mb^=^la0B@mO)R|I+ztv{R16l(2hy`qI^yg0@`ODYZ)9s;)a*j3D{eWv z?n>UU4YZ1>S}kg6EN_|xY>)fxl1o-Tb1lIB?XFea9;v~lr)?+t2F?z=-t2j#WQs%I JDUO5R{SB?KSXTf5 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/cp949prober.cpython-36.pyc b/modules/modules/chardet/__pycache__/cp949prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44f7eb8d8037854cc93327a10bd56c9350d5df92 GIT binary patch literal 1099 zcmah|O>Yx15ViL!+mf_UJ_HgcI7QGRpqC;9l%#NIQz}w8tX8s|wcBpx-E3{=kgB&- z>TlsM?UfUMffF;{mZleQWY6<>Ju`mu^19Pm{7w$i_bozxlDQE8{s7bTVG%@7MGBfw zir7*^KrRZay2!%fy0&FSmfp5&~hsWJUhxu3El^TiL&{}sg=DWu7}d@>G4QvI9clL zZLDvw;eZXk^tX00Nbz_0m&mLGkR+jkB;Ex%pn?kTJWhNW2ww!}WJZ$^u&WtxbU^}= zV9l-imW$t{%kTj>&|+|$<~b~uSb9cg-my1>L+jgM274CTXhy)c&d70$CxSpwy4zi- zLo=zQ))8E;W5)6_w~T2Fs6+HEWR3@B3hm+kzL?{SaU|?i>N?cYNDDj!Mydm_3yfuo z8^hQS@_WDcCjDllHt8om%G1rN>T}D}opHuhx-W|=t@3I$FOB6&t;&;^lap7xOf%qE zNPBH7pty33uT@hWLp@Jn8U%zc(M3O|r}yTFTDyAC4aShQ9^ON32?|VjyLITU=_PP= zscwUDxLKBATeqH^73D4W5vtE2|tuC=2G5x zbtPioy(SGQYp{?QgKyS z2QjkXgz^M{LB+(h9k&DLLoMBQ4V%+PBbk*(LeN|*i{`K71XeE>qf5G)rfO_R9f8+? d+)#cl^mQc-a@~mEHqU$a7>hv#w5j{~e*k_G2$28) literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/enums.cpython-36.pyc b/modules/modules/chardet/__pycache__/enums.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9841bf6a8dd51dd9382f41e4af3cd1bedf31619e GIT binary patch literal 2590 zcmbVOS#R4$5T-7QV(c95V+(YF9;kpuK+-oiD6E5a7|WC)(m^8#pw`^A#DpT{T{3|M z^eOo>{RjOmeC?C|LhqTC>j} z2FM#quCh&6tKXdqvl&GsIU(tU6D!W95=Jy7RB)0>&Oj1LHl8F|s#Jmr6^y53MuS&$ z%p0b;O|x{8h;7oLF=<6KRx0E>M&riuTHF~=X&5zvWLh@^xZ(LzfYA<+`~n!)1_ii# zkrf6dRveUBX;5M1fzB#mtDc*7Jj+ryr754gCV|JBgpzQung~7>2-weqG!Y~Ki;p=88_vSn!!U*mMA1Wj`Y1bnOyl7y0OxPKy==_R1lnx? zNn}Q;T)>~2z2b1Z*$%2b0rp{s52{Qb7_2&|@iMQpw1LS@uD3K^h4CF`KtO8w-7byC z8Kl8(7^PgyUw&**AT88)sX%E_H1V_H+FkR zPRF;sTz7h&e_-9{iqBzN0(3PqarXZ^;D82`Fy>1KIG^kQaR8?D4yt_*?6%V62Gd#fo%XgcsI5wI%jKsTj|1Kf zU-2lMBng}Ue7jqsb4|p5N)TCS0Ch}Gk|;{vKz=DK1z>$0CYdBj40w;Q`<{aqXn276 zix0k$+CUO(lNA6giu3Jl!P88{avNZq6M!vDK{)x69RXnVI1wQLb{MO}5#Ac&9&Dph zt6s=UK_oAw85Uc_|gRa9ALIIp< zLO~;i{9AS7f8pMXe~|r+>@Q@00(0uM8{`v;Ga_N5U{yiYz{{f|Sc)kDt literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/escprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/escprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8189b98bf0d3e2c649e64aa05eaf66e803ae8215 GIT binary patch literal 2581 zcma)7UvC>l5Z}E!pU?K$NlhA3pz0AMBqLfuctI6{Mv2p=O`IrBTXZs7F1KsP?%mnh zJ3|sV5|SfTLPA13@z_^h`U&_X_l9`t6Yo4Rvu8UEsStbG*}0wBe>16H4siX4M<2`N|DzBE!16I@p@o{IX4%Yt{LXtyqYrtD=fH$u;>=U zl3NOG*QVq?;W=)e6K)DR*4;ACH%ZNUMPd6IP0MSCo@|O_SN0Etgo)}}pLe59Gw~9! z?fHk@NYwPSvgJjcq1O=`-5?P%wNZbnmf90VwWwyKr3Wr+ZnN#3_4-y?-E8ixe6q5# z*0?(NaQEumqrKUj4|kk3Gz_-*2@pYC%89FS>gs&%IcZa_bK|_=8j8mUTW(I6JkPCj zGNx`G_yR8~-r^;0pA)yh%e(?(@i{SwTLQDpr}OpLzhsir--`~k{ljkTToO3LSj3L! zEc<;foY+4Up;&gj!9e!GY)-o`9WD~#CtxN=M4$ys{IS~Y`$Hkc!HFZhxEq`}QuzH& z)IIeM0^x|*_Xfg&L8p3isOA1g8x`I3X$VvKYt1cH&(ruqO$)Sj0_4J@S zO4{%>Wi&!?)F(ZD0Zc*?IwE7Or;RA5KLNrzWJH)gB0VF?^~`%jt^=?4@`;rc#&irC zv;X4kA9YKh`|V6-Uy_wUHk!#QnT+E}bBfL@dQH(P=)E;2h-Gkw)&Mw`0stOsE7a8% z(p)?o2q{Z&|I}iv8+8-L(n4lj7KhRXiA1OXkRNO|>diW9Zf@^xZEkGV*HaVRBO)%* z5HgR%LRIVG>h3D)$^!nHk9PLzs|{JipE(aa_?>{gncp8qNqUWCZWWyQ5IeC*((1(& zUKiseHCc=yl;$M3C8=qt5sRR$?g!5*Fy;qd95ePC`Fn5eZtHO@WZc^D4!W(?!C>7> zyw+CV_kz~G2nVe}cW}EK!G=L_TO55lJX-Oh7M>1QnT-G(z#c^LoxzE$z}-KB9=`{K z&?+^lP3Pf5irt)ir#JqM_&Za(`j{iIUBXTSCN8jp-a1}J|E`m7md@yi#?H|qhmjd0 z+S5>ewD^=HIn)^g;+Uy?ombSFczVB9kY(6dc~&kV2Z<3}ky$_00};suoW71^5lBsw zH;_lY8kO%L|1J`IvD)G;FmV+Kp%r+uK{aIs8|dlcl~*f2&7O=;$G!$VHi5wP5tI}_ zsqO%SI$j+)J2$l_m|&3?iaIV<0jQncymH{{n*Z-y_3SsFYfXW-`P!LRT|3o!^Lc11 ze5WjO+Jtfg9p9`sIxp}4ak}vGudh0wq1u02q0$ivgiF-M?Bt7WSfY$b!1RW8dh3cU zF6+;dRt^?oS6+Al%<-=y3PAh$OgsJ&ZwmYmXZlFD!OT1LQWCvqk1=hP zVfPA*b5q@?WJyGbCH-S%!kvLAWq#zMcX|BGvx3ia_8XuXO zjh%hAU6*ewX_h|B&HX0KrPjvITVXZHc4J{yrnAs+U~v{7IR((vIygxn zeI+ubeil^rG+knX%3|gMz(!jL-h@r!WgvtWA#y4ZIYszP;EL3O4=MJFc6$AaGjRtD z6dO}C#sQ@0B4c5n4+G?F#*T(wFp=aL<9(kom9kXarWWKeNb|{wyoIlEki3uNHjuPD z$(_Ck0$4T+z-bat@sAba1L!d(LMvxzm3g~l8@6GYD#tWxm9#vGz$|M@4Aitbsnckh zsa>&Jq&X1{!&sFTiQby{P{ck|omnYS1w<8&ER)SHcafS>>x;}1U*bh$EI>Bcc!4e% F{{RB3YL);1 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/escsm.cpython-36.pyc b/modules/modules/chardet/__pycache__/escsm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b74a6df5fff0ef628bd7c7e9272ed60a4ed018e6 GIT binary patch literal 7338 zcmeHLTTdE66yD{s+*R;W+gf9qK1dT9#kZzuM5ILpG(h{XAt56(D9v(l7arQ*(m&9D z)XZz2_zQjNoV_ou8Wg3iu-Vx;bI$qBWoOO~vlEMjKXc96T$1B{arPh2al4FGetJ0$ zbC{R7HZSr#hnGbU;lFsa)J%+1wHZydnmOhoK21fP*-M!`}rlh@XfdkXHQ%dk#GtZTNTH(=D#iF;idjo>?$Q zSRbVAG(@e&KRWJ0U($7v0c=Cg+uRkycvXy$5RQ;AiQuT7l_-8H#+c;ISyA7`6?PnP z=ypf5;YOQ!*zAD?*L-Q&F(NXa4n3Q9hBZ6?CLNG9WYoFQ%!_mQnK(~kc%ICWdAxw* z>RejD&&4>CcF&sKroC_YH2O4U+~Za=V#?TJG{ykWF_)X0Vgj#;izLowRDvwx1YT7A zUcyTiF8N}}mN}Q?X|#wM=dBK@^iiJ-p$-gv(Dk|UADv2sMm3^|8vU+JBMQLkthvTHlIs%b=(Mkc+Jpur)HxfVGcpW; zjmSaeIF;T?r&HO|FaV~5(1e}5!xI`jL_Gu^*i??nR5Y}{c;G}NLt|BhN!Cp3UEgxGj#V?`E~Rl=7dLdV;S2KHs9E|{{ST7#$=L$5&j#S}9HCs}#q87=NS1oD;BVlna zK^>krpcrX`0;ba)0}A9uy*es8pcrX`0;W3@$mvi&IQcc~5TW^9%D%0AQi!b7KA_W9 zEz|4mqduw?x(y`Ns-)ek^;*4DtHTbaB`HNNwg(q!)TzPIG$wuXNtA}te$)F(gYVj1 zJdnuyHHNPA*moo9Wk<_*xO~2KeuH1+^Vc;|fj$8L&6_HFm$c7j(b|3-^P+ J&aj<+{{gt@hv5JK literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/eucjpprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/eucjpprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eac2c85b177ab931390d85c870249e5468c89ed GIT binary patch literal 2385 zcmai0NpB-X6t3#cZO3*znJpP16eI@8h#3uw5JDrwV0$)AoG5lcw2X?5tKzh$yX{n$ zrNr`_95h${1P5;Xo;q;hG#7pV7kIDQwj9LbPF1~nwY*o~+wyUxQu>;l^nR)m@*7$E zIY562E&CoiPB@K8LIavufkkm{#dhKZj-lJ!*lnm{~8%a4R zQ}TrH0{1To_k}aJg9)o*y)$Ov&hYqM}jyC=KI_EXrW zIn0@>yg7lfpnNkHXJlBy9h|`Bv|ZoOZZ;VUDT{E4_8E)PNHHc|m`Wdc#lC@&Wr_4~ zev_|Z$3g^e3g-*BR_o``t=QU?A`=Rrbutm3z*uCgABS1S*w5sTZsYUbQ6^;8dmJ7| zy+`A5GgM*k#i$>~y{<^cy>T?Y7p0jB6uR;pI**UmN=p2dn8{p(7QV=hIsjTJ0 zHDqmJcO5(2@d309qX?CnURyKleFM`KUC_jh|J|TY=kPVjcfY=}0C#I>&*;qBfv9<9&%m{Z?n_IyVZ|F3IJo)HhgO_f zbI3iaG~57(FCUPzs@YqCy&SmJE8I=s0tfD{&B-fgW^oHRzsw+JcOYPf*SP%<$F1RY zoXwm$Sl|CIt7p}32*`65@+>3oCTM!=rS&6~56s=S z=VU=|V*n3#UOG5mz6Urr!86?U^qsreF8t+DuzMP*T?opN+zr+4F(gM=djmidiEj1g zPx#gEKyZS^gtlXm$};eEDTTbpAlj6Wm|C>kIy~Gz)LuLq420A!7sr!h=U2FRW!->K#k9!nIuc-mQ^#^qzd`O zF%aE<;#+8!% zp9fRkpju%aS*vDwf%AsreyYy%isr$U8I(ROg?Xx9X`Abfx@!Mnj>s2SH;lqHF#qDS F{{l?oKI;Gg literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/euckrfreq.cpython-36.pyc b/modules/modules/chardet/__pycache__/euckrfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0b907c2447662ecd55e4f2e33cc62a6c770cbc5 GIT binary patch literal 24089 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 XqzwJpGJM$Z;X}gw|Ns4eeFgp(9>OGv literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/euckrprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/euckrprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ae12829d4eac4ea7bf9f7dd655faf3a249ae5f4 GIT binary patch literal 1100 zcmah|%We}f6t(A-X-V3u0t6B(SVbb0c&rdYl%%j|Q&7{g7>#5(W4E2+nWVO7k*K>= z>bLMetY*uKUtq<(p0=bLaAe;zzBBi6?#Zi8XZ0&NPJcv%{3J^&0Q?@d8NeZkpo$bU zp%k&Fyuwd>hkX?kVG=qVsHkWqElNHS5sK)Nh)B|fpTwdyBHj2Gg-~5uKO9!d<{xHO z_D{JUN&7`l#!`c4vp*4ec`~xx$|28A^HRd?Az)WC;OL43B*B_n z^*tBAsW8I^aG}NExXp7oEV1;0EW9&s0Z!}NU;)o8w9$fqZC#MF7(IeOP`ck;sY6pu zrPe?@sbj|SGPjIr45&lATge<1%oG|&Q9lq%{WFdP%%!eFEseCmLtvyj2D`#ornoVT zeJ8&U`)|@CBeh9C@^PMSPp1QJdAc{rxJnOYF-@oWw3nC0a;19m{6%&Cl9y=)V-eEc zT3Kb^^wbS$YdX_0)bk9sK|tslU8OOd-(MnX>!zVQj3H}%{0^ f#em*We=hXjN*d&*5x;HPd-nv3K?$^}`}uzW%83gO literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/euctwfreq.cpython-36.pyc b/modules/modules/chardet/__pycache__/euctwfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fd7f726591d63df7818b547b7e0e7c957c56a73 GIT binary patch literal 54712 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 aVNy?+JZhAvQQmm-Kd=A%0{>rsf&T(V=y68? literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/euctwprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/euctwprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eed732a71e1285a4a971a63e017505e584187b1 GIT binary patch literal 1100 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 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/gb2312prober.cpython-36.pyc b/modules/modules/chardet/__pycache__/gb2312prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d95a7b562569b8109af7131f9353117d254c15e GIT binary patch literal 1108 zcmah|&u`N(6t?rL*_3WDG$argI8ljB+QtbX#MZ(t>p&{w5Jj@w*zGboX=XczPP=u| z{uchFTsiSCaN@mW9o+?7+5X~}y!ZTlUk|$7_3vbo)Bzzs$;$8me}riUum~ckA~}sI zMeHaicVoA~uJUp}_8aV}An(K-N{)%}MQ}qzAnC%5L(v(LUigbbsvfPM4l8A|qq&v+ zbFN3ye$}(F)DYR~&qP*CN0wVT zveA$YzYIQ|q)_C3xOd3B1t3XG1&N(oGNFPB=O&C@=?PbOH)KI$A8^w(;NX^cB*v~g zb<`GUn@sTzIB>`8IL#YaEV1;OESw8x0YU3pZvoHDx50wI-nk|hAw~p&tn{?ER{N$Z zrPjbasYAxHBD0KXOsIW4TT2@@n8`J&QE!VC1{g;QuB5JgEseCmglD9hz`n*3`tOo6Beh9B^Kq6OmgRt3o}A25u99yuFOxDWce27*uGEga+^a74d6A@`jF9$z zpN>(2vJq;xoa+!8dIi%UAasMS(~w?muTr(UywU^Ckhea5h*uI6xNuJEp#4s7z*&## z2(|{d%O*V55q1RkWChRVYdA3uEX28b_MqnKTmP@y>7&JfoqrS#6)&b0pGp*YS@hvW zmv8h!)DatGtX^jmyLu%DnwoH7=_kH7c)|s`Xg_SqzvC bP1vOV+ewQWLBjX#^*+47X3z!^ZGO%l)S?Ol literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/hebrewprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/hebrewprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df4af374c11108efb76d14edcc405ab7319e193b GIT binary patch literal 2942 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 Lh^PJ;^$h!89SK>z literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc b/modules/modules/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eaca84599a0ce381a71c550cdcc9f3fed34ed1e GIT binary patch literal 30403 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 Sf466chgS^!@6YNR?EeCD!Frki literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/langhebrewmodel.cpython-36.pyc b/modules/modules/chardet/__pycache__/langhebrewmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70beb8e49180986606e4eabed97614cde7215cea GIT binary patch literal 23384 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 T)Ay|M-t~Rcr|&lHzyJOV4D~5m literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/langhungarianmodel.cpython-36.pyc b/modules/modules/chardet/__pycache__/langhungarianmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..688af3504a6aef3b29ebed5650596c32c3e094fb GIT binary patch literal 24826 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 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/langthaimodel.cpython-36.pyc b/modules/modules/chardet/__pycache__/langthaimodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aaba6bd7413b0ec2d3e93575b08f22e7c36ba8b GIT binary patch literal 23363 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 R?3KOq=jPAfWZr-N{0k;ZTt@%^ literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/langturkishmodel.cpython-36.pyc b/modules/modules/chardet/__pycache__/langturkishmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f112809afa47a6ebbc51692a827eff54e76d1d21 GIT binary patch literal 23381 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 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/latin1prober.cpython-36.pyc b/modules/modules/chardet/__pycache__/latin1prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42f40cc84050e14d81639ee8a49ef08aa5521453 GIT binary patch literal 2913 zcmc&#OK%%D5GJ_~t=20?Nu5`dzAi;nzyZ<+nifH0LwOZ&Y`3ygV4;>>i-slyTXkHQuc5Y3JeBpJx6|a&7YE^B>IuINjxv+<8u#*m=nD%FU9I`X%ZCH0R0P{h zzml^O&u0oCf9Q%O}jBgWjv-#y5dz!~?w1p_(mNY_z-M0baJ& z04{7*p_2g|XKmw=ItRRo9(;cPGhScb;H#UDRTY*L9;(ixB2^cVhl+MYF1{3XfXOjf z2v{1?(S;dXErv6OqARVT7g^!rSN@PSi!mh@x_`*XCA zu+i0-OQ*H|@orN*=r3*z(j@B)la3rr-8Sovml`c=3#cKoIP5F8fPs)CW4cfG=(p=* zdXIehXpceova4jz(F~-HcEL@~WdbYi*cJ3CQ%l<0@xhIyb=)6}T@R#!eF!;l2Xryu zcdK8ZtPB`Bg+mphTMNy#b~l9>=HGPnHkVl^?dID&l^WJ^bL1gj2QWAKbsPKD0zf-? z+!rz}VxnAMS#C6JKw#<_e|2qxKfZ5#4si{KVU$3AAz$-sh?rpOnU)|{hPF(It~g3B z7qja`1R1w2rOakkrwx(rT3RQ%^!aG<3{uMyMW1CC`Aj^8$gVc4|^81np42#={{5l z0IHw0yFz9yc@m=e4g~x}{5>3V1Xe^{hH&}p669V$T_>QUYcpWY?yb#X0mS5i0vK}M z>x*HEe8lulSGHvTZz>4SRVJdY8da<80o0pfJmfv)rg7 zX#lA|L9&KZ6gmz Jho9=M`zJRGOE~}l literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/mbcharsetprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/mbcharsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..208a1e979b499e0db1a7b187f717f4950701f636 GIT binary patch literal 2204 zcma)7&2Aev5GJ`lUdb!jv7JA(P1P1@A)q$;gC1JAMN`{J48(F^%W1JtL99huUS+i_ zb15JeluP9zr@lk4z4a0L9K80FS11CsGnA~@fDLpd4u>3aW;mR0_+_P1enyU32Ngp8 zCKo;z`0t?=p8*j>(3JFOL@DwtWj!ZydT!)W@`wmWxMxJTl8&9o6W%_l`>!c%t5Z|i zIF8l6)K67@C{>-A5V<7l?CV%d6Yj+A<0O-I)P^my5AEYuJOd(0Lw4FJ`nRFJR?y_R74f}@+;z!Xdb*=G`DsJsZM@4 z)$)>`!&Rq@S`NvQoTmCb>Dc!pf8p3U}OT$lPuAko0}pjv`P*KI>|F0XK{Kul**La zxqz7RqG!rHjSJ1&5O#>RTgdcC`KXeb66b9Y7M%Y<{`qO+o7O=gRndAFA118_{r+aG zzDKUF2L_6f8i z07B>z_2D;s|LS0_ogb}@34$Y*XXI$N>pf?x0TRDECjeL709t9p#!z~6xjPR?3ZIgbs$E-wwE||V zmu44W7G^;A;+VX2M}R<>`5n*+c3}R7aMrP3>MrAGp#zR(`xq$ei>XYXgtkmm*ftC3c^R}75Rr>p3apHQyrb0cMr{A28VRf`46G literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9e55d57a2ba1fd677b52b833d6a24cc105ca6e7 GIT binary patch literal 1095 zcmZ8fO>fgc5Z(1hlh_WWDF;s6gVaiGL23~~(3Dmbh$_+ovMj9}dlMYiiM#6vfpS1f zrJnd9{G}B)PW%N<%xp{=b*&k{ncdaQd$W7ZruUuuZtQqWzdfo^d2CoS(_e0;{nh5e{*fh8}a;$bWg!IXzp3!O7w7-p=ka#_iYdZoAdD z030VFO-X2_&NUg()JpBEMrdCXhlCDLarOG!!%lC7KsT|>Z9?#02eZM{5xA0+bVlaZ z$ePiV{s8$)drnFR%mrHmtAW+Q8era>4C^z({23VqbArM`MXL)E`63<<*&q`oDAv@j znigD2A8P12W7#+>8IxF7A{ptTTSEsAgGg*jHqd$CbgeMTEA2|Ic-gkJqqrEz05+jk zgRw-!N-_46{QcN@5?v@RRdgKpv*<-p9K~fEy_qDjh|YOlL`7C?Wn)#wLTvHNo$2Ln zJdP5WbIQx*Kkp}Mh(lkL-Y&k%J5cQ*n7Rj!(3a)U)z7oO-M^*u_J5{r+J!*?@o}7U z#2wOjc{ND}n|4Oy8INPhg^nS_Hq(}W z(Erds(0|j<_qCt+3;k5>>U5_&e8xUI#3jd#S1YZa)oQic(;45xL?Zs9R?h!X(zJgx z^-tHdA9%f18PqhYQN5z=>qOTzx=8w%{!2gq81SJHs|GFJ56HY9*$2^}!TTxCktn@N z23Q}BvM3v%12pz$gv96)8MMZ5Min*~yeA)>O1T`PS?RUQuP${+J7pb8*#@O-SKAu# zUR?JJ~GTCbDl-A#(Uy<94+sbaS+jJVO zU!f03(!xVOxnfw-S(>23bcT-#bBmraI~UfgOR3xI#oL1L!Z!4SJ;zqZRB=z8Mp0$uzsViCO75~G zz0B^gyL18f#65Z?t0mV?_|Z#C>gMoPv9!B)z_RsXot?nh?4%Ef0i+*DgcH-)*!%fW zGGY#uD#co@P%pl(FmqT`%EeOsL)9FrfeK4BQraz63l(-?)s2JVK0Aqmz5yUHApFp$ zoy0jYBb)D@eEsA&n%>z=y?Q6g*W1Uj-%{+Tl&b$~MxSr2JzQNg2eZ3-<$B@O%j|J% zC-*G1`prgKa+&nW5NI3*k^nLSWE994C&v*$JbtsH@wr!F{+$!>P!&l)eVt$f4%rjXAzH6$0z2at1;5pUYUy$qr-Kk}gOPLlj2`x|bc)mBOKd9 zp(+w*clNxq;{xhK1p%=ktoM&*zH8(}PA44ZWlRg5Xz|55yC>w-MBIWmFx~Vff#ps{ zmHP@#2crn%39JrJm;BD_d+G@V=i{8-+&>G#Z^Q zMQZHMia4PZP#-D?hz()tg8$FF;Y3a+96q#nqM$hzQ;P2q7zNJR^K;!)or8}j8;8}# z->AZxCkI4o#P!FO^XwmR-j{iZY(H$8N503gVYT(F?PQo9{&q4nt*5^{?qqq?OzFGH zVMBkJnbOxK0R>@dY&|u4e1#tOy>mI8eY>28z%e7_f~<7MYveh~cdXC-^uWK9bdHl4 zkhsitCy^xWs&W8r-iE52E^ehQYjG4HhjaI|wO{r1VEd{n5;#_rAV zv7cm4|KkP?wr_}GlDue3-iN7`g~^$E5f@ zMxzG;&r{dARh@s$^d{$ItWLh8`*c|R(Wmp%(e^p~`KJS$fK%F%(=-WsLlhi zy_Oskyyx-QmNyJYC-|J0usxVenGtqyv|p>j%SmQz5h0RRXjHI`>-)@_cY;Ju! zXGUMA36Ev@i&qF9K#oHvMUxwt5K;+??`&q*Hqv5Li-%EVvl~1rd$`~k z17f1F`xNRDpvA2wttvE+&fI|9q>2cDwP!bxO(()t$2`!ciUA{AhBmAwj4lcu3)R*)d{YGD(F0R-a8jZ-3zG7eZ+CZLVr(w)- zTbA@ieYvYz7u%X&t5$-Y?fC6%y|5CXmFtbQz8<#Tew%Z}L;EY-SdY_c7&F|?Ieh}J qg|4pE6xTejPjSsNdUrK1=ws+#@G->Myj3n(C3qj&p#+(GSNsPxLkx=m literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/sbcharsetprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/sbcharsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d0490f28b7dfa964e504db5a38269a183d2730e GIT binary patch literal 2957 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 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/sjisprober.cpython-36.pyc b/modules/modules/chardet/__pycache__/sjisprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae325e2a6a6a8a32c6572defb51cfda0befd56ad GIT binary patch literal 2411 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 DGl~m< literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/utf8prober.cpython-36.pyc b/modules/modules/chardet/__pycache__/utf8prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad2359ac5adaa90bcd1ef4d7485484e3d11358b9 GIT binary patch literal 1942 zcmah~&1xe@5bmBojpUJR?1dx{!jg~;3TwkAgm^=UgwvAuBxxAK7CoOR(>ESyS55gUman28lwdTqvb;slP?t+8RkiUVlwFZOm*;&U>xS}B8>FY*Jj{jij>720AQgHA$5$KY{BCo$ zg_j)ryPK?g#E#lK&BF+8p8w35mieFv5>QS8gVVr#MNTL;xOw9Smewt9gKi6lJG^v5 zrZgyl?((wMU0&f!Hw41>copW#D`Jsg2~w%43c4>6I4#`$wiRK1_`?~4z>$3pA}2YW zkf|{=rm&ftxiy6~vpE6jOvtc=c23}G+N!(C&c-7lWeGl2E@OjqkTWK2SV{+NkXdgx><@a|qtQ;7 zhrPq|D2#i)NJhQUV6;9+vpkIBb#d`zeDOt?_V8*h^7%Z@Pc}#T@is=6vJ4SDf|0o( z2(8fyb?DXFTYxt1GWc(RK8COE0|bDW1ymeivNSM8>lW{?+Yxhj0j9Vt&g zg2-7KCgKTxZ-5}i)q4xx7SH^zQ&r^g4u5VOrl;fZRD8AIYZ3Xo{Yb|FhcF);I=P=g zc{!ZW9r9EE+5ptakWP##y*4LiZVb&cLq5)}p^ZiQoLo5CS_11cu)6oGWw2r)lVN2F zfSuX6vdD0W8($NHu%!#}$|#Q?x9fS@QMWeRu-EHe0tCu+)UHqF-25 zQt>ipP?@=qn1QmJold(WvB{LvYWwV{shr|~at{11uHD`CachSi_{#43+Z|u6oxrmWoDD1+(tdvFhr0TO!tp5d0~`oP7j>K(lx-Tx!i_jjkFVw2^CEEiaS} zem5@{LN^v&MyR}bF& zxpj+8G2^hmw(3TKMz!5)vc~>)hduAKpMe!SOF82-9-N7PmA!ljdxtPGY(=6|S;6o> zSP1_0&FYZ?$-2T{KDYhouQxIY~dtvP2Vg!BX=`ikL7C<$hbF{N0Bb3^JNWSD+L;>mPAX Bwmtv= literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/__pycache__/version.cpython-36.pyc b/modules/modules/chardet/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c001591362564c37c6cfb1bc2080d08a68955026 GIT binary patch literal 411 zcmX|7u};G<5Ova&qM)wKH`1XIP^Jo@0tE>P6+}yiDpKUcPGd-H*LDi+%GWUSH(B`u zMkY)NJ?Xu>)17qhU9a8trzj1-5JI08+i-0)u+aOK2$~_{%pB@Gxx{^QW)0F9qmH-! z@FyA5PzX}y6zD6{MuXt_3XA~F3YoKX1&SKQ=#ud{n2f@bD$N83UKTM`AW}#&tOzxJ zszd=V%w&v%rlypETmj|;HiLQ#bQw#WJmWdlf$#TmX)>YuFvJ`#a?Ceta6m8*;{SFq zFEGo4L=+u=-RuR2!Aa!=qmEa#qKJqjimJURs)gC6sjYHTwWe1OPVDTmnL@Kz)^4=1#cp=7elxHdS?yL53>E{-t|YxUb)AF~dt-P6AZ Np8X!to+Z!qoF66Hf~Wuh literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/big5freq.py b/modules/modules/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/modules/modules/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 +# +# +# 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/modules/modules/chardet/big5prober.py b/modules/modules/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/chardistribution.py b/modules/modules/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/charsetgroupprober.py b/modules/modules/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/charsetprober.py b/modules/modules/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/cli/__init__.py b/modules/modules/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/modules/modules/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/modules/modules/chardet/cli/__pycache__/__init__.cpython-36.pyc b/modules/modules/chardet/cli/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ce7f0d49d05cc953c09475443420b27cdae0420 GIT binary patch literal 168 zcmXr!<>d-vNQ+@)U|@I*#Bcx-Z~)?B79f$r5X_*-=(m!g2qcUkeuX+)#e^2878S?1 zB_?IYI2IJRB$gz`_~a)i=EQ`g<`%>hWESXV<`tJD=H%$678;fo8YSk%BxfWRrKFZ1 j=$y=$`1s7c%#!$cy@JYH95%W6DWy57b|CADftUdR=$I^2 literal 0 HcmV?d00001 diff --git a/modules/modules/chardet/cli/__pycache__/chardetect.cpython-36.pyc b/modules/modules/chardet/cli/__pycache__/chardetect.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11a15dd1aed9a6d66c68e78e40aeb4a34242c64d GIT binary patch literal 2639 zcma)8UvFEt6~F&$3YoGQN1`OEmP?Dn{FTIAzL-O#D=bYd9QGedqNq+DqC;v`7 z?^kc*3n71rf3466Z|DhM1i4=X!=MOJU#9>(aSyjiq{Ew|Rlw~Az# zI62O@i}tV$c}KLw)-V2WM|4CYwjp)ou4q3CR4F?P4;tZjUU!$@^*t~7ZmhD}u#2;7 ze8voaCN--{$tuN)N=Y`!a>;6L&NSntU`p1NGNi)HnamUu(#WxqB9Y~|5?OhwljLtN zcv0taFh~-H?;|!o<7%nMbX7=alY|O36pftTdTGEevQktRy0?Gu*#QRTjE$>uk_nt4 z*@OOPH|jSA28`=*mc6CC-+z!K-%MCpt(|~RwW`ixOx$OgS-G6Sr>v}JhD}seFm2#U zKS}bnb9=QAGz37$~N42+mX=1|<0&q)@ewyyxvFBuA8G^o{Gt#OmnEpEgZvy0rkF7QwZD6^Y=sr%Dk{ zldIJTbJ1;Y0c3~<%`SXMF>unH|IfwyTWMyhWE{bP@2AMT26RRwB8?Q(5g!38Yap;{ z0%e!$N;wO8rVY(54QRxd;4!GV;swjIQtAOahAAg9Q?XNt{9t0kWPiEGT-GbS0sDp` zPA9|k=+a2NX}08r9I!*Qw7j|v;FRZpEiyy1?z|1V%RRWIo3n9tTA~zeYkiIRotF=; z2khnk^;>v*d2nr$*I=D@oF>qxq@LyGu)D3ANT}VSi*lv-rHv+13L6Pjoo$TsN=q9r zwN*^2v5kHXtpbc`y#Xy9tZq? zLNMOcCt7^v1GN4$5TS@L7mCKh7qN-dJ=2)RWlZg~dFqSis|J8inxH_DOj~9Pn%l2J zH=A5}D4XELmne;Gl+x!Yp>Wz>cHzY05F;`IP!$DnBt@KYbvi?SKr1wbtZ5*b=n?4W3WWJ4`k{V4 zV2@V?a`;Cs$1P~jz?IYT4jV=4*5*GP|JFwVrMmGV++5}jVGUVL{I~%a+i>(d|M_cr za4ybJ2CvKh0yEVtr_er=L=5zpsDgZd!}!~SdqPe)3U9Ea^sWum$oijjBO9H`ytWZ} zZW|?h*S5J*o^SPfE8@1zl`wCAbPp7F+SLpt-3@Ha9e=0~0n_<|AFCNsE}5E@B{Aa0 zi->`~>B5nP2wV5o%kr`4JHn&4oy@>L6@el#^ow$`O)!2Og^y8XJ#hlZjO7U7Dd+%O=hqZPn_JP9@Xam`mGm z52lUr(qV%ud-XdgP$r;#ZezDoxskU1#F5pqAttd=!L#ynNct`sZz~GGBtZaX`2bwf z0hhGV2SEZ^eM&o8X-a$O?RD4f`iI>;+e}kYjnmX7DV}dUX);X}y}T-&u@ym2y 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/modules/modules/chardet/euckrfreq.py b/modules/modules/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/euckrprober.py b/modules/modules/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/euctwfreq.py b/modules/modules/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/modules/modules/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 +# + +# 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/modules/modules/chardet/euctwprober.py b/modules/modules/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/gb2312freq.py b/modules/modules/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/gb2312prober.py b/modules/modules/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/hebrewprober.py b/modules/modules/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/jisfreq.py b/modules/modules/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/jpcntx.py b/modules/modules/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langbulgarianmodel.py b/modules/modules/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langcyrillicmodel.py b/modules/modules/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langgreekmodel.py b/modules/modules/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langhebrewmodel.py b/modules/modules/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langhungarianmodel.py b/modules/modules/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langthaimodel.py b/modules/modules/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/langturkishmodel.py b/modules/modules/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/latin1prober.py b/modules/modules/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/mbcharsetprober.py b/modules/modules/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/mbcsgroupprober.py b/modules/modules/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/mbcssm.py b/modules/modules/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/sbcharsetprober.py b/modules/modules/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/sbcsgroupprober.py b/modules/modules/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/sjisprober.py b/modules/modules/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/universaldetector.py b/modules/modules/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/utf8prober.py b/modules/modules/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/modules/modules/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/modules/modules/chardet/version.py b/modules/modules/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/modules/modules/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/modules/modules/idna-2.7.dist-info/INSTALLER b/modules/modules/idna-2.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/idna-2.7.dist-info/LICENSE.txt b/modules/modules/idna-2.7.dist-info/LICENSE.txt new file mode 100644 index 0000000..3ee64fb --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/LICENSE.txt @@ -0,0 +1,80 @@ +License +------- + +Copyright (c) 2013-2018, Kim Davies. 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. + +#. Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided with + the distribution. + +#. Neither the name of the copyright holder nor the names of the + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +#. THIS SOFTWARE IS PROVIDED BY THE 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 HOLDERS 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. + +Portions of the codec implementation and unit tests are derived from the +Python standard library, which carries the `Python Software Foundation +License `_: + + Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved + +Portions of the unit tests are derived from the Unicode standard, which +is subject to the Unicode, Inc. License Agreement: + + Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in + . + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that + + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, + + (b) this copyright and permission notice appear in associated + documentation, and + + (c) there is clear notice in each modified Data File or in the Software + as well as in the documentation associated with the Data File(s) or + Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR 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 THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. diff --git a/modules/modules/idna-2.7.dist-info/METADATA b/modules/modules/idna-2.7.dist-info/METADATA new file mode 100644 index 0000000..b4ef4c7 --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/METADATA @@ -0,0 +1,239 @@ +Metadata-Version: 2.1 +Name: idna +Version: 2.7 +Summary: Internationalized Domain Names in Applications (IDNA) +Home-page: https://github.com/kjd/idna +Author: Kim Davies +Author-email: kim@cynosure.com.au +License: BSD-like +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalised Domain Names in Applications +(IDNA) protocol as specified in `RFC 5891 `_. +This is the latest version of the protocol and is sometimes referred to as +“IDNA 2008”. + +This library also provides support for Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +This acts as a suitable replacement for the “encodings.idna” module that +comes with the Python standard library, but only supports the +old, deprecated IDNA specification (`RFC 3490 `_). + +Basic functions are simply executed: + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + # Python 2 + >>> import idna + >>> idna.encode(u'ドメイン.テスト') + 'xn--eckwd4c7c.xn--zckzah' + >>> print idna.decode('xn--eckwd4c7c.xn--zckzah') + ドメイン.テスト + +Packages +-------- + +The latest tagged release version is published in the PyPI repository: + +.. image:: https://badge.fury.io/py/idna.svg + :target: http://badge.fury.io/py/idna + + +Installation +------------ + +To install this library, you can use pip: + +.. code-block:: bash + + $ pip install idna + +Alternatively, you can install the package using the bundled setup script: + +.. code-block:: bash + + $ python setup.py install + +This library works with Python 2.6 or later, and Python 3.3 or later. + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a domain +name argument and perform a conversion to A-labels or U-labels respectively. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + # Python 2 + >>> import idna.codec + >>> print u'домена.испытание'.encode('idna') + xn--80ahd1agd.xn--80akhbyknj4f + >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna') + домена.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel`` +functions if necessary: + +.. code-block:: pycon + + # Python 2 + >>> idna.alabel(u'测试') + 'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the IDNA +specification no longer normalizes input from different potential ways a user +may input a domain name. This functionality, known as a “mapping”, is now +considered by the specification to be a local user-interface issue distinct +from IDNA conversion functionality. + +This library provides one such mapping, that was developed by the Unicode +Consortium. Known as `Unicode IDNA Compatibility Processing `_, +it provides for both a regular mapping for typical applications, as well as +a transitional mapping to help migrate from older IDNA 2003 applications. + +For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL +LETTER K* is not allowed (nor are capital letters in general). UTS 46 will +convert this into lower case prior to applying the IDNA conversion. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode(u'Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from the older +2003 standard to the current standard. For example, in the original IDNA +specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two +*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this +conversion is not performed. + +.. code-block:: pycon + + # Python 2 + >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementors should use transitional processing with caution, only in rare +cases where conversion from legacy labels to current labels must be performed +(i.e. IDNA implementations that pre-date 2008). For typical applications +that just need to convert labels, transitional processing is unlikely to be +beneficial and could produce unexpected incompatible results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the +new module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification should +raise an exception derived from the ``idna.IDNAError`` base class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and right-to-left +characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is +an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext`` +when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO +or CONTEXTJ but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for +performance. These tables are derived from computing against eligibility criteria +in the respective standards. These tables are computed using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant tables from the Unicode Consortium and perform the +required calculations to identify eligibility. It has three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``, + the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors + who wish to track this library against a different Unicode version may use this tool + to manually generate a different version of the ``idnadata.py`` and ``uts46data.py`` + files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC + 5892 and the pre-computed tables published by `IANA `_. + +* ``idna-data U+0061``. Prints debugging output on the various properties + associated with an individual Unicode codepoint (in this case, U+0061), that are + used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging + or analysis. + +The tool accepts a number of arguments, described using ``idna-data -h``. Most notably, +the ``--version`` argument allows the specification of the version of Unicode to use +in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata`` +will generate library data against Unicode 9.0.0. + +Note that this script requires Python 3, but all generated library data will work +in Python 2.6+. + + +Testing +------- + +The library has a test suite based on each rule of the IDNA specification, as +well as tests that are provided as part of the Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +The tests are run automatically on each commit at Travis CI: + +.. image:: https://travis-ci.org/kjd/idna.svg?branch=master + :target: https://travis-ci.org/kjd/idna + + diff --git a/modules/modules/idna-2.7.dist-info/RECORD b/modules/modules/idna-2.7.dist-info/RECORD new file mode 100644 index 0000000..3e5b461 --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/RECORD @@ -0,0 +1,22 @@ +idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +idna/core.py,sha256=OwI5R_uuXU4PlOSoG8cjaMPA1hhdGGjjZ8I2MZhSPxo,11858 +idna/idnadata.py,sha256=zwxvoSsYqPHNa6xzXWHizXpDC28JJMGXRinhJ4Gkcz0,39285 +idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +idna/package_data.py,sha256=Vt9rtr32BzO7O25rypo8nzAs3syTJhG1ojU3J-s2RFo,21 +idna/uts46data.py,sha256=czULzYN5Lr9K5MmOH-1g3CJY7QPjGeHjYmC3saJ_BHk,197803 +idna-2.7.dist-info/LICENSE.txt,sha256=DUvHq9SNz7FOJCVO5AQGZzf_AWcUTiIpFKIRO4eUaD4,3947 +idna-2.7.dist-info/METADATA,sha256=rRIGQN4TE52ADjNub-LTnazbzjxmsviAzZia-v_nZHs,8866 +idna-2.7.dist-info/RECORD,, +idna-2.7.dist-info/WHEEL,sha256=J3CsTk7Mf2JNUyhImI-mjX-fmI4oDjyiXgWT4qgZiCE,110 +idna-2.7.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5 +idna-2.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna/__pycache__/codec.cpython-36.pyc,, +idna/__pycache__/compat.cpython-36.pyc,, +idna/__pycache__/core.cpython-36.pyc,, +idna/__pycache__/idnadata.cpython-36.pyc,, +idna/__pycache__/intranges.cpython-36.pyc,, +idna/__pycache__/package_data.cpython-36.pyc,, +idna/__pycache__/uts46data.cpython-36.pyc,, +idna/__pycache__/__init__.cpython-36.pyc,, diff --git a/modules/modules/idna-2.7.dist-info/WHEEL b/modules/modules/idna-2.7.dist-info/WHEEL new file mode 100644 index 0000000..f21b51c --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/idna-2.7.dist-info/top_level.txt b/modules/modules/idna-2.7.dist-info/top_level.txt new file mode 100644 index 0000000..c40472e --- /dev/null +++ b/modules/modules/idna-2.7.dist-info/top_level.txt @@ -0,0 +1 @@ +idna diff --git a/modules/modules/idna-2.8.dist-info/INSTALLER b/modules/modules/idna-2.8.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/idna-2.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/idna-2.8.dist-info/LICENSE.rst b/modules/modules/idna-2.8.dist-info/LICENSE.rst new file mode 100644 index 0000000..3ee64fb --- /dev/null +++ b/modules/modules/idna-2.8.dist-info/LICENSE.rst @@ -0,0 +1,80 @@ +License +------- + +Copyright (c) 2013-2018, Kim Davies. 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. + +#. Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided with + the distribution. + +#. Neither the name of the copyright holder nor the names of the + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +#. THIS SOFTWARE IS PROVIDED BY THE 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 HOLDERS 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. + +Portions of the codec implementation and unit tests are derived from the +Python standard library, which carries the `Python Software Foundation +License `_: + + Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved + +Portions of the unit tests are derived from the Unicode standard, which +is subject to the Unicode, Inc. License Agreement: + + Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in + . + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that + + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, + + (b) this copyright and permission notice appear in associated + documentation, and + + (c) there is clear notice in each modified Data File or in the Software + as well as in the documentation associated with the Data File(s) or + Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR 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 THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. diff --git a/modules/modules/idna-2.8.dist-info/METADATA b/modules/modules/idna-2.8.dist-info/METADATA new file mode 100644 index 0000000..30fde02 --- /dev/null +++ b/modules/modules/idna-2.8.dist-info/METADATA @@ -0,0 +1,239 @@ +Metadata-Version: 2.1 +Name: idna +Version: 2.8 +Summary: Internationalized Domain Names in Applications (IDNA) +Home-page: https://github.com/kjd/idna +Author: Kim Davies +Author-email: kim@cynosure.com.au +License: BSD-like +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalised Domain Names in Applications +(IDNA) protocol as specified in `RFC 5891 `_. +This is the latest version of the protocol and is sometimes referred to as +“IDNA 2008”. + +This library also provides support for Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +This acts as a suitable replacement for the “encodings.idna” module that +comes with the Python standard library, but only supports the +old, deprecated IDNA specification (`RFC 3490 `_). + +Basic functions are simply executed: + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + # Python 2 + >>> import idna + >>> idna.encode(u'ドメイン.テスト') + 'xn--eckwd4c7c.xn--zckzah' + >>> print idna.decode('xn--eckwd4c7c.xn--zckzah') + ドメイン.テスト + +Packages +-------- + +The latest tagged release version is published in the PyPI repository: + +.. image:: https://badge.fury.io/py/idna.svg + :target: http://badge.fury.io/py/idna + + +Installation +------------ + +To install this library, you can use pip: + +.. code-block:: bash + + $ pip install idna + +Alternatively, you can install the package using the bundled setup script: + +.. code-block:: bash + + $ python setup.py install + +This library works with Python 2.7 and Python 3.4 or later. + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a domain +name argument and perform a conversion to A-labels or U-labels respectively. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + # Python 2 + >>> import idna.codec + >>> print u'домена.испытание'.encode('idna') + xn--80ahd1agd.xn--80akhbyknj4f + >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna') + домена.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel`` +functions if necessary: + +.. code-block:: pycon + + # Python 2 + >>> idna.alabel(u'测试') + 'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the IDNA +specification no longer normalizes input from different potential ways a user +may input a domain name. This functionality, known as a “mapping”, is now +considered by the specification to be a local user-interface issue distinct +from IDNA conversion functionality. + +This library provides one such mapping, that was developed by the Unicode +Consortium. Known as `Unicode IDNA Compatibility Processing `_, +it provides for both a regular mapping for typical applications, as well as +a transitional mapping to help migrate from older IDNA 2003 applications. + +For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL +LETTER K* is not allowed (nor are capital letters in general). UTS 46 will +convert this into lower case prior to applying the IDNA conversion. + +.. code-block:: pycon + + # Python 3 + >>> import idna + >>> idna.encode(u'Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from the older +2003 standard to the current standard. For example, in the original IDNA +specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two +*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this +conversion is not performed. + +.. code-block:: pycon + + # Python 2 + >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementors should use transitional processing with caution, only in rare +cases where conversion from legacy labels to current labels must be performed +(i.e. IDNA implementations that pre-date 2008). For typical applications +that just need to convert labels, transitional processing is unlikely to be +beneficial and could produce unexpected incompatible results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the +new module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification should +raise an exception derived from the ``idna.IDNAError`` base class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and right-to-left +characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is +an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext`` +when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO +or CONTEXTJ but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for +performance. These tables are derived from computing against eligibility criteria +in the respective standards. These tables are computed using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant tables from the Unicode Consortium and perform the +required calculations to identify eligibility. It has three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``, + the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors + who wish to track this library against a different Unicode version may use this tool + to manually generate a different version of the ``idnadata.py`` and ``uts46data.py`` + files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC + 5892 and the pre-computed tables published by `IANA `_. + +* ``idna-data U+0061``. Prints debugging output on the various properties + associated with an individual Unicode codepoint (in this case, U+0061), that are + used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging + or analysis. + +The tool accepts a number of arguments, described using ``idna-data -h``. Most notably, +the ``--version`` argument allows the specification of the version of Unicode to use +in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata`` +will generate library data against Unicode 9.0.0. + +Note that this script requires Python 3, but all generated library data will work +in Python 2.7. + + +Testing +------- + +The library has a test suite based on each rule of the IDNA specification, as +well as tests that are provided as part of the Unicode Technical Standard 46, +`Unicode IDNA Compatibility Processing `_. + +The tests are run automatically on each commit at Travis CI: + +.. image:: https://travis-ci.org/kjd/idna.svg?branch=master + :target: https://travis-ci.org/kjd/idna + + diff --git a/modules/modules/idna-2.8.dist-info/RECORD b/modules/modules/idna-2.8.dist-info/RECORD new file mode 100644 index 0000000..1d72bf0 --- /dev/null +++ b/modules/modules/idna-2.8.dist-info/RECORD @@ -0,0 +1,22 @@ +idna-2.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-2.8.dist-info/LICENSE.rst,sha256=DUvHq9SNz7FOJCVO5AQGZzf_AWcUTiIpFKIRO4eUaD4,3947 +idna-2.8.dist-info/METADATA,sha256=X4QsM_BLMPhl4gC8SEnXjvl5-gj7hvwAl7UCyR418so,8862 +idna-2.8.dist-info/RECORD,, +idna-2.8.dist-info/WHEEL,sha256=CihQvCnsGZQBGAHLEUMf0IdA4fRduS_NBUTMgCTtvPM,110 +idna-2.8.dist-info/top_level.txt,sha256=jSag9sEDqvSPftxOQy-ABfGV_RSy7oFh4zZJpODV8k0,5 +idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +idna/__pycache__/__init__.cpython-36.pyc,, +idna/__pycache__/codec.cpython-36.pyc,, +idna/__pycache__/compat.cpython-36.pyc,, +idna/__pycache__/core.cpython-36.pyc,, +idna/__pycache__/idnadata.cpython-36.pyc,, +idna/__pycache__/intranges.cpython-36.pyc,, +idna/__pycache__/package_data.cpython-36.pyc,, +idna/__pycache__/uts46data.cpython-36.pyc,, +idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 diff --git a/modules/modules/idna-2.8.dist-info/WHEEL b/modules/modules/idna-2.8.dist-info/WHEEL new file mode 100644 index 0000000..dea0e20 --- /dev/null +++ b/modules/modules/idna-2.8.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/modules/modules/idna-2.8.dist-info/top_level.txt b/modules/modules/idna-2.8.dist-info/top_level.txt new file mode 100644 index 0000000..c40472e --- /dev/null +++ b/modules/modules/idna-2.8.dist-info/top_level.txt @@ -0,0 +1 @@ +idna diff --git a/modules/modules/idna/__init__.py b/modules/modules/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/modules/modules/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/modules/modules/idna/__pycache__/__init__.cpython-36.pyc b/modules/modules/idna/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b696605ce24b0f46d4a4f76df9379828c82f23 GIT binary patch literal 227 zcmXr!<>d-vNQ<#zU|@I*#Bjg_WH|tFu>_DvVMt-jVaR2SVq^rdnR1vy7*d#n88lg5 zG6JPF8E#m57=j9Px0%(r+75|gtN(^KP95=#<`KqlT|NzN}yUCB_y z2IPQ=U*67EF`>mky)kZyNtrQ@1qCiZ)iFN#$%#2JA*s0qF$I|gx|w;!C5bsXx~YYR srG-X`c`=zOd5I7rK0Y%qvm`!Vub}c4hfQvNN@-529mrY5ARBoY0ln`$IRF3v literal 0 HcmV?d00001 diff --git a/modules/modules/idna/__pycache__/codec.cpython-36.pyc b/modules/modules/idna/__pycache__/codec.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abf2bc3d9cc05666575ef42b580af6b51c325920 GIT binary patch literal 3074 zcmchZ&5s*36u|BI&Lo@NhSJhfAZ;&9rLOvc1VXfI*)32B#3*Sxxjm#>?ZrssudCw`PqJU{PFyI&%V60I4UY?RqhvX}#ls406L z=1!C&3y~&8f`7*kb4=@y=`hy z(-AfJ*LM3>F2|$MP!ycCIc}o;Rh+Xd%{SX;zPm6vqlj>!V_*m$vZ`ze2g=In4aFcX zgn<<^<9T2zOY*FzEEX3r7!JpizY?(mJ^uc5{r&DO$%X8G9N$a3*G8ia=+*sfn8aE4 z3qBZiN9pK%n#&^2vh#fF;&|&)oOe@}$CW_qC#$3TdO}>i#3d2KqfNu2ma*N?wpy*u z>;E^^f`txROVnYh0*_1}AAu>Bu-rtki~?;`i6dCTp07Z9#vUscI|0?lxRcq+i=sRp z@F-G#6b*)KoME{UMO))It6H@As+G*=)FnN!2b1E7OACZ&_`X0*0%`Zd17CwAkAm1` zm@)&L$JEYasn(4=5q!XNIL+(Yfkc8M;)iF4WexA|PGZ9_E5 zOD1mV77psMyv6Q7fa$xXGo__{97fTtcGX%!O}kM2MO|plg}{)a=<1?3J^2SdaU2@7 z2t4gv8W*(^jq?<-kJzw~k>JXfqbx0y6OTqbX9BILc~Vw?nC3xkA63fkrFjgoN{1?` z8ij~cbZ#6_IfBb^R)Eu{+c325vyVg7jP8wlJuafktKNhO4QM5?j5@mSfYg+Lhc2!CC;EYjM7)3;SER-z)DZ6!R^P@jJF)Upz!a8r;AQsI0On{PE--AJvHSq}1(vfJ%fPQ@ z8TEC|@`Gox>=xbv%fA83?u_NyF3Ue?mi;{}*UJ4YH(s7)Wydl}Q*jJzqq$y$dd_nN zb$tP9Kb1Pj=LuKtjBoK8j&cHoGU28ZC$Wm}1r4`&9ZCn-7N@WsArMHVcnd`v#c33C zYA~$LIj$n-hoF=1f!O8P^l8KNfLdSE`y8H)13b^*+2wgBIv?QqZJ2OjW%H1JB}1{WnJU6-Prx^q zxClZSa1pr4a4n*RcS`HB?) literal 0 HcmV?d00001 diff --git a/modules/modules/idna/__pycache__/compat.cpython-36.pyc b/modules/modules/idna/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61ac41d90e89890f69134e6fe83a66893b2c90a0 GIT binary patch literal 587 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 literal 0 HcmV?d00001 diff --git a/modules/modules/idna/__pycache__/idnadata.cpython-36.pyc b/modules/modules/idna/__pycache__/idnadata.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b83d63948fb989f8a713611dfbae16a587c69dc GIT binary patch literal 29766 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 B&5Qs5 literal 0 HcmV?d00001 diff --git a/modules/modules/idna/__pycache__/package_data.cpython-36.pyc b/modules/modules/idna/__pycache__/package_data.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24592dcee526ee831ff0c9d22d8c8306a9087a17 GIT binary patch literal 181 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 jZ98|<7GvkewO6TGaoe7*N=x^aE!wXC5B{%} 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/modules/modules/idna/idnadata.py b/modules/modules/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/modules/modules/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/modules/modules/idna/intranges.py b/modules/modules/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/modules/modules/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/modules/modules/idna/package_data.py b/modules/modules/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/modules/modules/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/modules/modules/idna/uts46data.py b/modules/modules/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/modules/modules/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + ] + +def _seg_19(): + return [ + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + ] + +def _seg_22(): + return [ + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + ] + +def _seg_25(): + return [ + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + ] + +def _seg_26(): + return [ + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4F, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + ] + +def _seg_27(): + return [ + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + ] + +def _seg_29(): + return [ + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + ] + +def _seg_31(): + return [ + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + ] + +def _seg_35(): + return [ + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + ] + +def _seg_39(): + return [ + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + ] + +def _seg_44(): + return [ + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + ] + +def _seg_65(): + return [ + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + ] + +def _seg_69(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'M', u'配'), + ] + +def _seg_72(): + return [ + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + ] + +def _seg_78(): + return [ + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/modules/modules/requests-2.19.1.dist-info/DESCRIPTION.rst b/modules/modules/requests-2.19.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..2a58be5 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,1684 @@ +Requests: HTTP for Humans +========================= + +.. image:: https://img.shields.io/pypi/v/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io + +.. image:: https://img.shields.io/github/contributors/requests/requests.svg + :target: https://github.com/requests/requests/graphs/contributors + +.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz + +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. + +.. image:: https://farm5.staticflickr.com/4317/35198386374_1939af3de6_k_d.jpg + +Behold, the power of Requests: + +.. code-block:: python + + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) + >>> r.status_code + 200 + >>> r.headers['content-type'] + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' + >>> r.text + u'{"type":"User"...' + >>> r.json() + {u'disk_usage': 368627, u'private_gists': 484, ...} + +See `the similar code, sans Requests `_. + +.. image:: https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png + :target: http://docs.python-requests.org/ + + +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the +need for manual labor. There's no need to manually add query strings to your +URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling +are 100% automatic, thanks to `urllib3 `_. + +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 downloads +every month. You don't want to be left out! + +Feature Support +--------------- + +Requests is ready for today's web. + +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- ``.netrc`` Support +- Chunked Requests + +Requests officially supports Python 2.7 & 3.4–3.6, and runs great on PyPy. + +Installation +------------ + +To install Requests, simply use `pipenv `_ (or pip, of course): + +.. code-block:: bash + + $ pipenv install requests + ✨🍰✨ + +Satisfaction guaranteed. + +Documentation +------------- + +Fantastic documentation is available at http://docs.python-requests.org/, for a limited time only. + + +How to Contribute +----------------- + +#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. +#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). +#. Write a test which shows that the bug was fixed or that the feature works as expected. +#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. + +.. _`the repository`: https://github.com/requests/requests +.. _AUTHORS: https://github.com/requests/requests/blob/master/AUTHORS.rst +.. _Contributor Friendly: https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open + + +.. :changelog: + +Release History +--------------- + +dev ++++ + +- [Short description of non-trivial change.] + +2.19.1 (2018-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed issue where status_codes.py's ``init`` function failed trying to append to + a ``__doc__`` value of ``None``. + +2.19.0 (2018-06-12) ++++++++++++++++++++ + +**Improvements** + +- Warn user about possible slowdown when using cryptography version < 1.3.4 +- Check for invalid host in proxy URL, before forwarding request to adapter. +- Fragments are now properly maintained across redirects. (RFC7231 7.1.2) +- Removed use of cgi module to expedite library load time. +- Added support for SHA-256 and SHA-512 digest auth algorithms. +- Minor performance improvement to ``Request.content``. +- Migrate to using collections.abc for 3.7 compatibility. + +**Bugfixes** + +- Parsing empty ``Link`` headers with ``parse_header_links()`` no longer return one bogus entry. +- Fixed issue where loading the default certificate bundle from a zip archive + would raise an ``IOError``. +- Fixed issue with unexpected ``ImportError`` on windows system which do not support ``winreg`` module. +- DNS resolution in proxy bypass no longer includes the username and password in + the request. This also fixes the issue of DNS queries failing on macOS. +- Properly normalize adapter prefixes for url comparison. +- Passing ``None`` as a file pointer to the ``files`` param no longer raises an exception. +- Calling ``copy`` on a ``RequestsCookieJar`` will now preserve the cookie policy correctly. + +**Dependencies** + +- We now support idna v2.7. +- We now support urllib3 v1.23. + +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**Improvements** + +- Error messages for invalid headers now include the header name for easier debugging + +**Dependencies** + +- We now support idna v2.6. + +2.18.3 (2017-08-02) ++++++++++++++++++++ + +**Improvements** + +- Running ``$ python -m requests.help`` now includes the installed version of idna. + +**Bugfixes** + +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encountering SSL problems when using urllib3 v1.22. + +2.18.2 (2017-07-25) ++++++++++++++++++++ + +**Bugfixes** + +- ``requests.help`` no longer fails on Python 2.6 due to the absence of + ``ssl.OPENSSL_VERSION_NUMBER``. + +**Dependencies** + +- We now support urllib3 v1.22. + +2.18.1 (2017-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fix an error in the packaging whereby the ``*.whl`` contained incorrect data + that regressed the fix in v2.17.3. + +2.18.0 (2017-06-14) ++++++++++++++++++++ + +**Improvements** + +- ``Response`` is now a context manager, so can be used directly in a ``with`` statement + without first having to be wrapped by ``contextlib.closing()``. + +**Bugfixes** + +- Resolve installation failure if multiprocessing is not available +- Resolve tests crash if multiprocessing is not able to determine the number of CPU cores +- Resolve error swallowing in utils set_environ generator + + +2.17.3 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.2 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.1 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.0 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Removal of the 301 redirect cache. This improves thread-safety. + + +2.16.5 (2017-05-28) ++++++++++++++++++++ + +- Improvements to ``$ python -m requests.help``. + +2.16.4 (2017-05-27) ++++++++++++++++++++ + +- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers! + +2.16.3 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +2.16.2 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +No code modification (noted below) should be necessary any longer. + +2.16.1 (2017-05-27) ++++++++++++++++++++ + +- Restored the ``requests.packages`` namespace for compatibility reasons. +- Bugfix for ``urllib3`` version parsing. + +**Note**: code that was written to import against the ``requests.packages`` +namespace previously will have to import code that rests at this module-level +now. + +For example:: + + from requests.packages.urllib3.poolmanager import PoolManager + +Will need to be re-written to be:: + + from requests.packages import urllib3 + urllib3.poolmanager.PoolManager + +Or, even better:: + + from urllib3.poolmanager import PoolManager + +2.16.0 (2017-05-26) ++++++++++++++++++++ + +- Unvendor ALL the things! + +2.15.1 (2017-05-26) ++++++++++++++++++++ + +- Everyone makes mistakes. + +2.15.0 (2017-05-26) ++++++++++++++++++++ + +**Improvements** + +- Introduction of the ``Response.next`` property, for getting the next + ``PreparedResponse`` from a redirect chain (when ``allow_redirects=False``). +- Internal refactoring of ``__version__`` module. + +**Bugfixes** + +- Restored once-optional parameter for ``requests.utils.get_environ_proxies()``. + +2.14.2 (2017-05-10) ++++++++++++++++++++ + +**Bugfixes** + +- Changed a less-than to an equal-to and an or in the dependency markers to + widen compatibility with older setuptools releases. + +2.14.1 (2017-05-09) ++++++++++++++++++++ + +**Bugfixes** + +- Changed the dependency markers to widen compatibility with older pip + releases. + +2.14.0 (2017-05-09) ++++++++++++++++++++ + +**Improvements** + +- It is now possible to pass ``no_proxy`` as a key to the ``proxies`` + dictionary to provide handling similar to the ``NO_PROXY`` environment + variable. +- When users provide invalid paths to certificate bundle files or directories + Requests now raises ``IOError``, rather than failing at the time of the HTTPS + request with a fairly inscrutable certificate validation error. +- The behavior of ``SessionRedirectMixin`` was slightly altered. + ``resolve_redirects`` will now detect a redirect by calling + ``get_redirect_target(response)`` instead of directly + querying ``Response.is_redirect`` and ``Response.headers['location']``. + Advanced users will be able to process malformed redirects more easily. +- Changed the internal calculation of elapsed request time to have higher + resolution on Windows. +- Added ``win_inet_pton`` as conditional dependency for the ``[socks]`` extra + on Windows with Python 2.7. +- Changed the proxy bypass implementation on Windows: the proxy bypass + check doesn't use forward and reverse DNS requests anymore +- URLs with schemes that begin with ``http`` but are not ``http`` or ``https`` + no longer have their host parts forced to lowercase. + +**Bugfixes** + +- Much improved handling of non-ASCII ``Location`` header values in redirects. + Fewer ``UnicodeDecodeErrors`` are encountered on Python 2, and Python 3 now + correctly understands that Latin-1 is unlikely to be the correct encoding. +- If an attempt to ``seek`` file to find out its length fails, we now + appropriately handle that by aborting our content-length calculations. +- Restricted ``HTTPDigestAuth`` to only respond to auth challenges made on 4XX + responses, rather than to all auth challenges. +- Fixed some code that was firing ``DeprecationWarning`` on Python 3.6. +- The dismayed person emoticon (``/o\\``) no longer has a big head. I'm sure + this is what you were all worrying about most. + + +**Miscellaneous** + +- Updated bundled urllib3 to v1.21.1. +- Updated bundled chardet to v3.0.2. +- Updated bundled idna to v2.5. +- Updated bundled certifi to 2017.4.17. + +2.13.0 (2017-01-24) ++++++++++++++++++++ + +**Features** + +- Only load the ``idna`` library when we've determined we need it. This will + save some memory for users. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.20. +- Updated bundled idna to 2.2. + +2.12.5 (2017-01-18) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed an issue with JSON encoding detection, specifically detecting + big-endian UTF-32 with BOM. + +2.12.4 (2016-12-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from 2.12.2 where non-string types were rejected in the + basic auth parameters. While support for this behaviour has been readded, + the behaviour is deprecated and will be removed in the future. + +2.12.3 (2016-12-01) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from v2.12.1 for URLs with schemes that begin with "http". + These URLs have historically been processed as though they were HTTP-schemed + URLs, and so have had parameters added. This was removed in v2.12.2 in an + overzealous attempt to resolve problems with IDNA-encoding those URLs. This + change was reverted: the other fixes for IDNA-encoding have been judged to + be sufficient to return to the behaviour Requests had before v2.12.0. + +2.12.2 (2016-11-30) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed several issues with IDNA-encoding URLs that are technically invalid but + which are widely accepted. Requests will now attempt to IDNA-encode a URL if + it can but, if it fails, and the host contains only ASCII characters, it will + be passed through optimistically. This will allow users to opt-in to using + IDNA2003 themselves if they want to, and will also allow technically invalid + but still common hostnames. +- Fixed an issue where URLs with leading whitespace would raise + ``InvalidSchema`` errors. +- Fixed an issue where some URLs without the HTTP or HTTPS schemes would still + have HTTP URL preparation applied to them. +- Fixed an issue where Unicode strings could not be used in basic auth. +- Fixed an issue encountered by some Requests plugins where constructing a + Response object would cause ``Response.content`` to raise an + ``AttributeError``. + +2.12.1 (2016-11-16) ++++++++++++++++++++ + +**Bugfixes** + +- Updated setuptools 'security' extra for the new PyOpenSSL backend in urllib3. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19.1. + +2.12.0 (2016-11-15) ++++++++++++++++++++ + +**Improvements** + +- Updated support for internationalized domain names from IDNA2003 to IDNA2008. + This updated support is required for several forms of IDNs and is mandatory + for .de domains. +- Much improved heuristics for guessing content lengths: Requests will no + longer read an entire ``StringIO`` into memory. +- Much improved logic for recalculating ``Content-Length`` headers for + ``PreparedRequest`` objects. +- Improved tolerance for file-like objects that have no ``tell`` method but + do have a ``seek`` method. +- Anything that is a subclass of ``Mapping`` is now treated like a dictionary + by the ``data=`` keyword argument. +- Requests now tolerates empty passwords in proxy credentials, rather than + stripping the credentials. +- If a request is made with a file-like object as the body and that request is + redirected with a 307 or 308 status code, Requests will now attempt to + rewind the body object so it can be replayed. + +**Bugfixes** + +- When calling ``response.close``, the call to ``close`` will be propagated + through to non-urllib3 backends. +- Fixed issue where the ``ALL_PROXY`` environment variable would be preferred + over scheme-specific variables like ``HTTP_PROXY``. +- Fixed issue where non-UTF8 reason phrases got severely mangled by falling + back to decoding using ISO 8859-1 instead. +- Fixed a bug where Requests would not correctly correlate cookies set when + using custom Host headers if those Host headers did not use the native + string type for the platform. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19. +- Updated bundled certifi certs to 2016.09.26. + +2.11.1 (2016-08-17) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed a bug when using ``iter_content`` with ``decode_unicode=True`` for + streamed bodies would raise ``AttributeError``. This bug was introduced in + 2.11. +- Strip Content-Type and Transfer-Encoding headers from the header block when + following a redirect that transforms the verb from POST/PUT to GET. + +2.11.0 (2016-08-08) ++++++++++++++++++++ + +**Improvements** + +- Added support for the ``ALL_PROXY`` environment variable. +- Reject header values that contain leading whitespace or newline characters to + reduce risk of header smuggling. + +**Bugfixes** + +- Fixed occasional ``TypeError`` when attempting to decode a JSON response that + occurred in an error case. Now correctly returns a ``ValueError``. +- Requests would incorrectly ignore a non-CIDR IP address in the ``NO_PROXY`` + environment variables: Requests now treats it as a specific IP. +- Fixed a bug when sending JSON data that could cause us to encounter obscure + OpenSSL errors in certain network conditions (yes, really). +- Added type checks to ensure that ``iter_content`` only accepts integers and + ``None`` for chunk sizes. +- Fixed issue where responses whose body had not been fully consumed would have + the underlying connection closed but not returned to the connection pool, + which could cause Requests to hang in situations where the ``HTTPAdapter`` + had been configured to use a blocking connection pool. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.16. +- Some previous releases accidentally accepted non-strings as acceptable header values. This release does not. + +2.10.0 (2016-04-29) ++++++++++++++++++++ + +**New Features** + +- SOCKS Proxy Support! (requires PySocks; ``$ pip install requests[socks]``) + +**Miscellaneous** + +- Updated bundled urllib3 to 1.15.1. + +2.9.2 (2016-04-29) +++++++++++++++++++ + +**Improvements** + +- Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict + as its underlying datastore. + +**Bugfixes** + +- Don't use redirect_cache if allow_redirects=False +- When passed objects that throw exceptions from ``tell()``, send them via + chunked transfer encoding instead of failing. +- Raise a ProxyError for proxy related connection issues. + +2.9.1 (2015-12-21) +++++++++++++++++++ + +**Bugfixes** + +- Resolve regression introduced in 2.9.0 that made it impossible to send binary + strings as bodies in Python 3. +- Fixed errors when calculating cookie expiration dates in certain locales. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.13.1. + +2.9.0 (2015-12-15) +++++++++++++++++++ + +**Minor Improvements** (Backwards compatible) + +- The ``verify`` keyword argument now supports being passed a path to a + directory of CA certificates, not just a single-file bundle. +- Warnings are now emitted when sending files opened in text mode. +- Added the 511 Network Authentication Required status code to the status code + registry. + +**Bugfixes** + +- For file-like objects that are not seeked to the very beginning, we now + send the content length for the number of bytes we will actually read, rather + than the total size of the file, allowing partial file uploads. +- When uploading file-like objects, if they are empty or have no obvious + content length we set ``Transfer-Encoding: chunked`` rather than + ``Content-Length: 0``. +- We correctly receive the response in buffered mode when uploading chunked + bodies. +- We now handle being passed a query string as a bytestring on Python 3, by + decoding it as UTF-8. +- Sessions are now closed in all cases (exceptional and not) when using the + functional API rather than leaking and waiting for the garbage collector to + clean them up. +- Correctly handle digest auth headers with a malformed ``qop`` directive that + contains no token, by treating it the same as if no ``qop`` directive was + provided at all. +- Minor performance improvements when removing specific cookies by name. + +**Miscellaneous** + +- Updated urllib3 to 1.13. + +2.8.1 (2015-10-13) +++++++++++++++++++ + +**Bugfixes** + +- Update certificate bundle to match ``certifi`` 2015.9.6.2's weak certificate + bundle. +- Fix a bug in 2.8.0 where requests would raise ``ConnectTimeout`` instead of + ``ConnectionError`` +- When using the PreparedRequest flow, requests will now correctly respect the + ``json`` parameter. Broken in 2.8.0. +- When using the PreparedRequest flow, requests will now correctly handle a + Unicode-string method name on Python 2. Broken in 2.8.0. + +2.8.0 (2015-10-05) +++++++++++++++++++ + +**Minor Improvements** (Backwards Compatible) + +- Requests now supports per-host proxies. This allows the ``proxies`` + dictionary to have entries of the form + ``{'://': ''}``. Host-specific proxies will be used + in preference to the previously-supported scheme-specific ones, but the + previous syntax will continue to work. +- ``Response.raise_for_status`` now prints the URL that failed as part of the + exception message. +- ``requests.utils.get_netrc_auth`` now takes an ``raise_errors`` kwarg, + defaulting to ``False``. When ``True``, errors parsing ``.netrc`` files cause + exceptions to be thrown. +- Change to bundled projects import logic to make it easier to unbundle + requests downstream. +- Changed the default User-Agent string to avoid leaking data on Linux: now + contains only the requests version. + +**Bugfixes** + +- The ``json`` parameter to ``post()`` and friends will now only be used if + neither ``data`` nor ``files`` are present, consistent with the + documentation. +- We now ignore empty fields in the ``NO_PROXY`` environment variable. +- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining + ``stream=True`` with ``contextlib.closing``. +- Prevented bugs where we would attempt to return the same connection back to + the connection pool twice when sending a Chunked body. +- Miscellaneous minor internal changes. +- Digest Auth support is now thread safe. + +**Updates** + +- Updated urllib3 to 1.12. + +2.7.0 (2015-05-03) +++++++++++++++++++ + +This is the first release that follows our new release process. For more, see +`our documentation +`_. + +**Bugfixes** + +- Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer + encoding and response framing. + +2.6.2 (2015-04-23) +++++++++++++++++++ + +**Bugfixes** + +- Fix regression where compressed data that was sent as chunked data was not + properly decompressed. (#2561) + +2.6.1 (2015-04-22) +++++++++++++++++++ + +**Bugfixes** + +- Remove VendorAlias import machinery introduced in v2.5.2. + +- Simplify the PreparedRequest.prepare API: We no longer require the user to + pass an empty list to the hooks keyword argument. (c.f. #2552) + +- Resolve redirects now receives and forwards all of the original arguments to + the adapter. (#2503) + +- Handle UnicodeDecodeErrors when trying to deal with a unicode URL that + cannot be encoded in ASCII. (#2540) + +- Populate the parsed path of the URI field when performing Digest + Authentication. (#2426) + +- Copy a PreparedRequest's CookieJar more reliably when it is not an instance + of RequestsCookieJar. (#2527) + +2.6.0 (2015-03-14) +++++++++++++++++++ + +**Bugfixes** + +- CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie + without a host value set would use the hostname for the redirected URL + exposing requests users to session fixation attacks and potentially cookie + stealing. This was disclosed privately by Matthew Daley of + `BugFuzz `_. This affects all versions of requests from + v2.1.0 to v2.5.3 (inclusive on both ends). + +- Fix error when requests is an ``install_requires`` dependency and ``python + setup.py test`` is run. (#2462) + +- Fix error when urllib3 is unbundled and requests continues to use the + vendored import location. + +- Include fixes to ``urllib3``'s header handling. + +- Requests' handling of unvendored dependencies is now more restrictive. + +**Features and Improvements** + +- Support bytearrays when passed as parameters in the ``files`` argument. + (#2468) + +- Avoid data duplication when creating a request with ``str``, ``bytes``, or + ``bytearray`` input to the ``files`` argument. + +2.5.3 (2015-02-24) +++++++++++++++++++ + +**Bugfixes** + +- Revert changes to our vendored certificate bundle. For more context see + (#2455, #2456, and http://bugs.python.org/issue23476) + +2.5.2 (2015-02-23) +++++++++++++++++++ + +**Features and Improvements** + +- Add sha256 fingerprint support. (`shazow/urllib3#540`_) + +- Improve the performance of headers. (`shazow/urllib3#544`_) + +**Bugfixes** + +- Copy pip's import machinery. When downstream redistributors remove + requests.packages.urllib3 the import machinery will continue to let those + same symbols work. Example usage in requests' documentation and 3rd-party + libraries relying on the vendored copies of urllib3 will work without having + to fallback to the system urllib3. + +- Attempt to quote parts of the URL on redirect if unquoting and then quoting + fails. (#2356) + +- Fix filename type check for multipart form-data uploads. (#2411) + +- Properly handle the case where a server issuing digest authentication + challenges provides both auth and auth-int qop-values. (#2408) + +- Fix a socket leak. (`shazow/urllib3#549`_) + +- Fix multiple ``Set-Cookie`` headers properly. (`shazow/urllib3#534`_) + +- Disable the built-in hostname verification. (`shazow/urllib3#526`_) + +- Fix the behaviour of decoding an exhausted stream. (`shazow/urllib3#535`_) + +**Security** + +- Pulled in an updated ``cacert.pem``. + +- Drop RC4 from the default cipher list. (`shazow/urllib3#551`_) + +.. _shazow/urllib3#551: https://github.com/shazow/urllib3/pull/551 +.. _shazow/urllib3#549: https://github.com/shazow/urllib3/pull/549 +.. _shazow/urllib3#544: https://github.com/shazow/urllib3/pull/544 +.. _shazow/urllib3#540: https://github.com/shazow/urllib3/pull/540 +.. _shazow/urllib3#535: https://github.com/shazow/urllib3/pull/535 +.. _shazow/urllib3#534: https://github.com/shazow/urllib3/pull/534 +.. _shazow/urllib3#526: https://github.com/shazow/urllib3/pull/526 + +2.5.1 (2014-12-23) +++++++++++++++++++ + +**Behavioural Changes** + +- Only catch HTTPErrors in raise_for_status (#2382) + +**Bugfixes** + +- Handle LocationParseError from urllib3 (#2344) +- Handle file-like object filenames that are not strings (#2379) +- Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (#2389) + +2.5.0 (2014-12-01) +++++++++++++++++++ + +**Improvements** + +- Allow usage of urllib3's Retry object with HTTPAdapters (#2216) +- The ``iter_lines`` method on a response now accepts a delimiter with which + to split the content (#2295) + +**Behavioural Changes** + +- Add deprecation warnings to functions in requests.utils that will be removed + in 3.0 (#2309) +- Sessions used by the functional API are always closed (#2326) +- Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (#2323) + +**Bugfixes** + +- Only parse the URL once (#2353) +- Allow Content-Length header to always be overridden (#2332) +- Properly handle files in HTTPDigestAuth (#2333) +- Cap redirect_cache size to prevent memory abuse (#2299) +- Fix HTTPDigestAuth handling of redirects after authenticating successfully + (#2253) +- Fix crash with custom method parameter to Session.request (#2317) +- Fix how Link headers are parsed using the regular expression library (#2271) + +**Documentation** + +- Add more references for interlinking (#2348) +- Update CSS for theme (#2290) +- Update width of buttons and sidebar (#2289) +- Replace references of Gittip with Gratipay (#2282) +- Add link to changelog in sidebar (#2273) + +2.4.3 (2014-10-06) +++++++++++++++++++ + +**Bugfixes** + +- Unicode URL improvements for Python 2. +- Re-order JSON param for backwards compat. +- Automatically defrag authentication schemes from host/pass URIs. (`#2249 `_) + + +2.4.2 (2014-10-05) +++++++++++++++++++ + +**Improvements** + +- FINALLY! Add json parameter for uploads! (`#2258 `_) +- Support for bytestring URLs on Python 3.x (`#2238 `_) + +**Bugfixes** + +- Avoid getting stuck in a loop (`#2244 `_) +- Multiple calls to iter* fail with unhelpful error. (`#2240 `_, `#2241 `_) + +**Documentation** + +- Correct redirection introduction (`#2245 `_) +- Added example of how to send multiple files in one request. (`#2227 `_) +- Clarify how to pass a custom set of CAs (`#2248 `_) + + + +2.4.1 (2014-09-09) +++++++++++++++++++ + +- Now has a "security" package extras set, ``$ pip install requests[security]`` +- Requests will now use Certifi if it is available. +- Capture and re-raise urllib3 ProtocolError +- Bugfix for responses that attempt to redirect to themselves forever (wtf?). + + +2.4.0 (2014-08-29) +++++++++++++++++++ + +**Behavioral Changes** + +- ``Connection: keep-alive`` header is now sent automatically. + +**Improvements** + +- Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts. +- Allow copying of PreparedRequests without headers/cookies. +- Updated bundled urllib3 version. +- Refactored settings loading from environment -- new `Session.merge_environment_settings`. +- Handle socket errors in iter_content. + + +2.3.0 (2014-05-16) +++++++++++++++++++ + +**API Changes** + +- New ``Response`` property ``is_redirect``, which is true when the + library could have processed this response as a redirection (whether + or not it actually did). +- The ``timeout`` parameter now affects requests with both ``stream=True`` and + ``stream=False`` equally. +- The change in v2.0.0 to mandate explicit proxy schemes has been reverted. + Proxy schemes now default to ``http://``. +- The ``CaseInsensitiveDict`` used for HTTP headers now behaves like a normal + dictionary when references as string or viewed in the interpreter. + +**Bugfixes** + +- No longer expose Authorization or Proxy-Authorization headers on redirect. + Fix CVE-2014-1829 and CVE-2014-1830 respectively. +- Authorization is re-evaluated each redirect. +- On redirect, pass url as native strings. +- Fall-back to autodetected encoding for JSON when Unicode detection fails. +- Headers set to ``None`` on the ``Session`` are now correctly not sent. +- Correctly honor ``decode_unicode`` even if it wasn't used earlier in the same + response. +- Stop advertising ``compress`` as a supported Content-Encoding. +- The ``Response.history`` parameter is now always a list. +- Many, many ``urllib3`` bugfixes. + +2.2.1 (2014-01-23) +++++++++++++++++++ + +**Bugfixes** + +- Fixes incorrect parsing of proxy credentials that contain a literal or encoded '#' character. +- Assorted urllib3 fixes. + +2.2.0 (2014-01-09) +++++++++++++++++++ + +**API Changes** + +- New exception: ``ContentDecodingError``. Raised instead of ``urllib3`` + ``DecodeError`` exceptions. + +**Bugfixes** + +- Avoid many many exceptions from the buggy implementation of ``proxy_bypass`` on OS X in Python 2.6. +- Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory. +- Use the correct pool size for pools of connections to proxies. +- Fix iteration of ``CookieJar`` objects. +- Ensure that cookies are persisted over redirect. +- Switch back to using chardet, since it has merged with charade. + +2.1.0 (2013-12-05) +++++++++++++++++++ + +- Updated CA Bundle, of course. +- Cookies set on individual Requests through a ``Session`` (e.g. via ``Session.get()``) are no longer persisted to the ``Session``. +- Clean up connections when we hit problems during chunked upload, rather than leaking them. +- Return connections to the pool when a chunked upload is successful, rather than leaking it. +- Match the HTTPbis recommendation for HTTP 301 redirects. +- Prevent hanging when using streaming uploads and Digest Auth when a 401 is received. +- Values of headers set by Requests are now always the native string type. +- Fix previously broken SNI support. +- Fix accessing HTTP proxies using proxy authentication. +- Unencode HTTP Basic usernames and passwords extracted from URLs. +- Support for IP address ranges for no_proxy environment variable +- Parse headers correctly when users override the default ``Host:`` header. +- Avoid munging the URL in case of case-sensitive servers. +- Looser URL handling for non-HTTP/HTTPS urls. +- Accept unicode methods in Python 2.6 and 2.7. +- More resilient cookie handling. +- Make ``Response`` objects pickleable. +- Actually added MD5-sess to Digest Auth instead of pretending to like last time. +- Updated internal urllib3. +- Fixed @Lukasa's lack of taste. + +2.0.1 (2013-10-24) +++++++++++++++++++ + +- Updated included CA Bundle with new mistrusts and automated process for the future +- Added MD5-sess to Digest Auth +- Accept per-file headers in multipart file POST messages. +- Fixed: Don't send the full URL on CONNECT messages. +- Fixed: Correctly lowercase a redirect scheme. +- Fixed: Cookies not persisted when set via functional API. +- Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. +- Updated internal urllib3 and chardet. + +2.0.0 (2013-09-24) +++++++++++++++++++ + +**API Changes:** + +- Keys in the Headers dictionary are now native strings on all Python versions, + i.e. bytestrings on Python 2, unicode on Python 3. +- Proxy URLs now *must* have an explicit scheme. A ``MissingSchema`` exception + will be raised if they don't. +- Timeouts now apply to read time if ``Stream=False``. +- ``RequestException`` is now a subclass of ``IOError``, not ``RuntimeError``. +- Added new method to ``PreparedRequest`` objects: ``PreparedRequest.copy()``. +- Added new method to ``Session`` objects: ``Session.update_request()``. This + method updates a ``Request`` object with the data (e.g. cookies) stored on + the ``Session``. +- Added new method to ``Session`` objects: ``Session.prepare_request()``. This + method updates and prepares a ``Request`` object, and returns the + corresponding ``PreparedRequest`` object. +- Added new method to ``HTTPAdapter`` objects: ``HTTPAdapter.proxy_headers()``. + This should not be called directly, but improves the subclass interface. +- ``httplib.IncompleteRead`` exceptions caused by incorrect chunked encoding + will now raise a Requests ``ChunkedEncodingError`` instead. +- Invalid percent-escape sequences now cause a Requests ``InvalidURL`` + exception to be raised. +- HTTP 208 no longer uses reason phrase ``"im_used"``. Correctly uses + ``"already_reported"``. +- HTTP 226 reason added (``"im_used"``). + +**Bugfixes:** + +- Vastly improved proxy support, including the CONNECT verb. Special thanks to + the many contributors who worked towards this improvement. +- Cookies are now properly managed when 401 authentication responses are + received. +- Chunked encoding fixes. +- Support for mixed case schemes. +- Better handling of streaming downloads. +- Retrieve environment proxies from more locations. +- Minor cookies fixes. +- Improved redirect behaviour. +- Improved streaming behaviour, particularly for compressed data. +- Miscellaneous small Python 3 text encoding bugs. +- ``.netrc`` no longer overrides explicit auth. +- Cookies set by hooks are now correctly persisted on Sessions. +- Fix problem with cookies that specify port numbers in their host field. +- ``BytesIO`` can be used to perform streaming uploads. +- More generous parsing of the ``no_proxy`` environment variable. +- Non-string objects can be passed in data values alongside files. + +1.2.3 (2013-05-25) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.2 (2013-05-23) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.1 (2013-05-20) +++++++++++++++++++ + +- 301 and 302 redirects now change the verb to GET for all verbs, not just + POST, improving browser compatibility. +- Python 3.3.2 compatibility +- Always percent-encode location headers +- Fix connection adapter matching to be most-specific first +- new argument to the default connection adapter for passing a block argument +- prevent a KeyError when there's no link headers + +1.2.0 (2013-03-31) +++++++++++++++++++ + +- Fixed cookies on sessions and on requests +- Significantly change how hooks are dispatched - hooks now receive all the + arguments specified by the user when making a request so hooks can make a + secondary request with the same parameters. This is especially necessary for + authentication handler authors +- certifi support was removed +- Fixed bug where using OAuth 1 with body ``signature_type`` sent no data +- Major proxy work thanks to @Lukasa including parsing of proxy authentication + from the proxy url +- Fix DigestAuth handling too many 401s +- Update vendored urllib3 to include SSL bug fixes +- Allow keyword arguments to be passed to ``json.loads()`` via the + ``Response.json()`` method +- Don't send ``Content-Length`` header by default on ``GET`` or ``HEAD`` + requests +- Add ``elapsed`` attribute to ``Response`` objects to time how long a request + took. +- Fix ``RequestsCookieJar`` +- Sessions and Adapters are now picklable, i.e., can be used with the + multiprocessing library +- Update charade to version 1.0.3 + +The change in how hooks are dispatched will likely cause a great deal of +issues. + +1.1.0 (2013-01-10) +++++++++++++++++++ + +- CHUNKED REQUESTS +- Support for iterable response bodies +- Assume servers persist redirect params +- Allow explicit content types to be specified for file data +- Make merge_kwargs case-insensitive when looking up keys + +1.0.3 (2012-12-18) +++++++++++++++++++ + +- Fix file upload encoding bug +- Fix cookie behavior + +1.0.2 (2012-12-17) +++++++++++++++++++ + +- Proxy fix for HTTPAdapter. + +1.0.1 (2012-12-17) +++++++++++++++++++ + +- Cert verification exception bug. +- Proxy fix for HTTPAdapter. + +1.0.0 (2012-12-17) +++++++++++++++++++ + +- Massive Refactor and Simplification +- Switch to Apache 2.0 license +- Swappable Connection Adapters +- Mountable Connection Adapters +- Mutable ProcessedRequest chain +- /s/prefetch/stream +- Removal of all configuration +- Standard library logging +- Make Response.json() callable, not property. +- Usage of new charade project, which provides python 2 and 3 simultaneous chardet. +- Removal of all hooks except 'response' +- Removal of all authentication helpers (OAuth, Kerberos) + +This is not a backwards compatible change. + +0.14.2 (2012-10-27) ++++++++++++++++++++ + +- Improved mime-compatible JSON handling +- Proxy fixes +- Path hack fixes +- Case-Insensitive Content-Encoding headers +- Support for CJK parameters in form posts + + +0.14.1 (2012-10-01) ++++++++++++++++++++ + +- Python 3.3 Compatibility +- Simply default accept-encoding +- Bugfixes + + +0.14.0 (2012-09-02) +++++++++++++++++++++ + +- No more iter_content errors if already downloaded. + +0.13.9 (2012-08-25) ++++++++++++++++++++ + +- Fix for OAuth + POSTs +- Remove exception eating from dispatch_hook +- General bugfixes + +0.13.8 (2012-08-21) ++++++++++++++++++++ + +- Incredible Link header support :) + +0.13.7 (2012-08-19) ++++++++++++++++++++ + +- Support for (key, value) lists everywhere. +- Digest Authentication improvements. +- Ensure proxy exclusions work properly. +- Clearer UnicodeError exceptions. +- Automatic casting of URLs to strings (fURL and such) +- Bugfixes. + +0.13.6 (2012-08-06) ++++++++++++++++++++ + +- Long awaited fix for hanging connections! + +0.13.5 (2012-07-27) ++++++++++++++++++++ + +- Packaging fix + +0.13.4 (2012-07-27) ++++++++++++++++++++ + +- GSSAPI/Kerberos authentication! +- App Engine 2.7 Fixes! +- Fix leaking connections (from urllib3 update) +- OAuthlib path hack fix +- OAuthlib URL parameters fix. + +0.13.3 (2012-07-12) ++++++++++++++++++++ + +- Use simplejson if available. +- Do not hide SSLErrors behind Timeouts. +- Fixed param handling with urls containing fragments. +- Significantly improved information in User Agent. +- client certificates are ignored when verify=False + +0.13.2 (2012-06-28) ++++++++++++++++++++ + +- Zero dependencies (once again)! +- New: Response.reason +- Sign querystring parameters in OAuth 1.0 +- Client certificates no longer ignored when verify=False +- Add openSUSE certificate support + +0.13.1 (2012-06-07) ++++++++++++++++++++ + +- Allow passing a file or file-like object as data. +- Allow hooks to return responses that indicate errors. +- Fix Response.text and Response.json for body-less responses. + +0.13.0 (2012-05-29) ++++++++++++++++++++ + +- Removal of Requests.async in favor of `grequests `_ +- Allow disabling of cookie persistence. +- New implementation of safe_mode +- cookies.get now supports default argument +- Session cookies not saved when Session.request is called with return_response=False +- Env: no_proxy support. +- RequestsCookieJar improvements. +- Various bug fixes. + +0.12.1 (2012-05-08) ++++++++++++++++++++ + +- New ``Response.json`` property. +- Ability to add string file uploads. +- Fix out-of-range issue with iter_lines. +- Fix iter_content default size. +- Fix POST redirects containing files. + +0.12.0 (2012-05-02) ++++++++++++++++++++ + +- EXPERIMENTAL OAUTH SUPPORT! +- Proper CookieJar-backed cookies interface with awesome dict-like interface. +- Speed fix for non-iterated content chunks. +- Move ``pre_request`` to a more usable place. +- New ``pre_send`` hook. +- Lazily encode data, params, files. +- Load system Certificate Bundle if ``certify`` isn't available. +- Cleanups, fixes. + +0.11.2 (2012-04-22) ++++++++++++++++++++ + +- Attempt to use the OS's certificate bundle if ``certifi`` isn't available. +- Infinite digest auth redirect fix. +- Multi-part file upload improvements. +- Fix decoding of invalid %encodings in URLs. +- If there is no content in a response don't throw an error the second time that content is attempted to be read. +- Upload data on redirects. + +0.11.1 (2012-03-30) ++++++++++++++++++++ + +* POST redirects now break RFC to do what browsers do: Follow up with a GET. +* New ``strict_mode`` configuration to disable new redirect behavior. + + +0.11.0 (2012-03-14) ++++++++++++++++++++ + +* Private SSL Certificate support +* Remove select.poll from Gevent monkeypatching +* Remove redundant generator for chunked transfer encoding +* Fix: Response.ok raises Timeout Exception in safe_mode + +0.10.8 (2012-03-09) ++++++++++++++++++++ + +* Generate chunked ValueError fix +* Proxy configuration by environment variables +* Simplification of iter_lines. +* New `trust_env` configuration for disabling system/environment hints. +* Suppress cookie errors. + +0.10.7 (2012-03-07) ++++++++++++++++++++ + +* `encode_uri` = False + +0.10.6 (2012-02-25) ++++++++++++++++++++ + +* Allow '=' in cookies. + +0.10.5 (2012-02-25) ++++++++++++++++++++ + +* Response body with 0 content-length fix. +* New async.imap. +* Don't fail on netrc. + + +0.10.4 (2012-02-20) ++++++++++++++++++++ + +* Honor netrc. + +0.10.3 (2012-02-20) ++++++++++++++++++++ + +* HEAD requests don't follow redirects anymore. +* raise_for_status() doesn't raise for 3xx anymore. +* Make Session objects picklable. +* ValueError for invalid schema URLs. + +0.10.2 (2012-01-15) ++++++++++++++++++++ + +* Vastly improved URL quoting. +* Additional allowed cookie key values. +* Attempted fix for "Too many open files" Error +* Replace unicode errors on first pass, no need for second pass. +* Append '/' to bare-domain urls before query insertion. +* Exceptions now inherit from RuntimeError. +* Binary uploads + auth fix. +* Bugfixes. + + +0.10.1 (2012-01-23) ++++++++++++++++++++ + +* PYTHON 3 SUPPORT! +* Dropped 2.5 Support. (*Backwards Incompatible*) + +0.10.0 (2012-01-21) ++++++++++++++++++++ + +* ``Response.content`` is now bytes-only. (*Backwards Incompatible*) +* New ``Response.text`` is unicode-only. +* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Response.text`` will guess an encoding. +* Default to ISO-8859-1 (Western) encoding for "text" subtypes. +* Removal of `decode_unicode`. (*Backwards Incompatible*) +* New multiple-hooks system. +* New ``Response.register_hook`` for registering hooks within the pipeline. +* ``Response.url`` is now Unicode. + +0.9.3 (2012-01-18) +++++++++++++++++++ + +* SSL verify=False bugfix (apparent on windows machines). + +0.9.2 (2012-01-18) +++++++++++++++++++ + +* Asynchronous async.send method. +* Support for proper chunk streams with boundaries. +* session argument for Session classes. +* Print entire hook tracebacks, not just exception instance. +* Fix response.iter_lines from pending next line. +* Fix but in HTTP-digest auth w/ URI having query strings. +* Fix in Event Hooks section. +* Urllib3 update. + + +0.9.1 (2012-01-06) +++++++++++++++++++ + +* danger_mode for automatic Response.raise_for_status() +* Response.iter_lines refactor + +0.9.0 (2011-12-28) +++++++++++++++++++ + +* verify ssl is default. + + +0.8.9 (2011-12-28) +++++++++++++++++++ + +* Packaging fix. + + +0.8.8 (2011-12-28) +++++++++++++++++++ + +* SSL CERT VERIFICATION! +* Release of Cerifi: Mozilla's cert list. +* New 'verify' argument for SSL requests. +* Urllib3 update. + +0.8.7 (2011-12-24) +++++++++++++++++++ + +* iter_lines last-line truncation fix +* Force safe_mode for async requests +* Handle safe_mode exceptions more consistently +* Fix iteration on null responses in safe_mode + +0.8.6 (2011-12-18) +++++++++++++++++++ + +* Socket timeout fixes. +* Proxy Authorization support. + +0.8.5 (2011-12-14) +++++++++++++++++++ + +* Response.iter_lines! + +0.8.4 (2011-12-11) +++++++++++++++++++ + +* Prefetch bugfix. +* Added license to installed version. + +0.8.3 (2011-11-27) +++++++++++++++++++ + +* Converted auth system to use simpler callable objects. +* New session parameter to API methods. +* Display full URL while logging. + +0.8.2 (2011-11-19) +++++++++++++++++++ + +* New Unicode decoding system, based on over-ridable `Response.encoding`. +* Proper URL slash-quote handling. +* Cookies with ``[``, ``]``, and ``_`` allowed. + +0.8.1 (2011-11-15) +++++++++++++++++++ + +* URL Request path fix +* Proxy fix. +* Timeouts fix. + +0.8.0 (2011-11-13) +++++++++++++++++++ + +* Keep-alive support! +* Complete removal of Urllib2 +* Complete removal of Poster +* Complete removal of CookieJars +* New ConnectionError raising +* Safe_mode for error catching +* prefetch parameter for request methods +* OPTION method +* Async pool size throttling +* File uploads send real names +* Vendored in urllib3 + +0.7.6 (2011-11-07) +++++++++++++++++++ + +* Digest authentication bugfix (attach query data to path) + +0.7.5 (2011-11-04) +++++++++++++++++++ + +* Response.content = None if there was an invalid response. +* Redirection auth handling. + +0.7.4 (2011-10-26) +++++++++++++++++++ + +* Session Hooks fix. + +0.7.3 (2011-10-23) +++++++++++++++++++ + +* Digest Auth fix. + + +0.7.2 (2011-10-23) +++++++++++++++++++ + +* PATCH Fix. + + +0.7.1 (2011-10-23) +++++++++++++++++++ + +* Move away from urllib2 authentication handling. +* Fully Remove AuthManager, AuthObject, &c. +* New tuple-based auth system with handler callbacks. + + +0.7.0 (2011-10-22) +++++++++++++++++++ + +* Sessions are now the primary interface. +* Deprecated InvalidMethodException. +* PATCH fix. +* New config system (no more global settings). + + +0.6.6 (2011-10-19) +++++++++++++++++++ + +* Session parameter bugfix (params merging). + + +0.6.5 (2011-10-18) +++++++++++++++++++ + +* Offline (fast) test suite. +* Session dictionary argument merging. + + +0.6.4 (2011-10-13) +++++++++++++++++++ + +* Automatic decoding of unicode, based on HTTP Headers. +* New ``decode_unicode`` setting. +* Removal of ``r.read/close`` methods. +* New ``r.faw`` interface for advanced response usage.* +* Automatic expansion of parameterized headers. + + +0.6.3 (2011-10-13) +++++++++++++++++++ + +* Beautiful ``requests.async`` module, for making async requests w/ gevent. + + +0.6.2 (2011-10-09) +++++++++++++++++++ + +* GET/HEAD obeys allow_redirects=False. + + +0.6.1 (2011-08-20) +++++++++++++++++++ + +* Enhanced status codes experience ``\o/`` +* Set a maximum number of redirects (``settings.max_redirects``) +* Full Unicode URL support +* Support for protocol-less redirects. +* Allow for arbitrary request types. +* Bugfixes + + +0.6.0 (2011-08-17) +++++++++++++++++++ + +* New callback hook system +* New persistent sessions object and context manager +* Transparent Dict-cookie handling +* Status code reference object +* Removed Response.cached +* Added Response.request +* All args are kwargs +* Relative redirect support +* HTTPError handling improvements +* Improved https testing +* Bugfixes + + +0.5.1 (2011-07-23) +++++++++++++++++++ + +* International Domain Name Support! +* Access headers without fetching entire body (``read()``) +* Use lists as dicts for parameters +* Add Forced Basic Authentication +* Forced Basic is default authentication type +* ``python-requests.org`` default User-Agent header +* CaseInsensitiveDict lower-case caching +* Response.history bugfix + + +0.5.0 (2011-06-21) +++++++++++++++++++ + +* PATCH Support +* Support for Proxies +* HTTPBin Test Suite +* Redirect Fixes +* settings.verbose stream writing +* Querystrings for all methods +* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised + ``r.requests.get('hwe://blah'); r.raise_for_status()`` + + +0.4.1 (2011-05-22) +++++++++++++++++++ + +* Improved Redirection Handling +* New 'allow_redirects' param for following non-GET/HEAD Redirects +* Settings module refactoring + + +0.4.0 (2011-05-15) +++++++++++++++++++ + +* Response.history: list of redirected responses +* Case-Insensitive Header Dictionaries! +* Unicode URLs + + +0.3.4 (2011-05-14) +++++++++++++++++++ + +* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) +* Internal Refactor +* Bytes data upload Bugfix + + + +0.3.3 (2011-05-12) +++++++++++++++++++ + +* Request timeouts +* Unicode url-encoded data +* Settings context manager and module + + +0.3.2 (2011-04-15) +++++++++++++++++++ + +* Automatic Decompression of GZip Encoded Content +* AutoAuth Support for Tupled HTTP Auth + + +0.3.1 (2011-04-01) +++++++++++++++++++ + +* Cookie Changes +* Response.read() +* Poster fix + + +0.3.0 (2011-02-25) +++++++++++++++++++ + +* Automatic Authentication API Change +* Smarter Query URL Parameterization +* Allow file uploads and POST data together +* New Authentication Manager System + - Simpler Basic HTTP System + - Supports all build-in urllib2 Auths + - Allows for custom Auth Handlers + + +0.2.4 (2011-02-19) +++++++++++++++++++ + +* Python 2.5 Support +* PyPy-c v1.4 Support +* Auto-Authentication tests +* Improved Request object constructor + +0.2.3 (2011-02-15) +++++++++++++++++++ + +* New HTTPHandling Methods + - Response.__nonzero__ (false if bad HTTP Status) + - Response.ok (True if expected HTTP Status) + - Response.error (Logged HTTPError if bad HTTP Status) + - Response.raise_for_status() (Raises stored HTTPError) + + +0.2.2 (2011-02-14) +++++++++++++++++++ + +* Still handles request in the event of an HTTPError. (Issue #2) +* Eventlet and Gevent Monkeypatch support. +* Cookie Support (Issue #1) + + +0.2.1 (2011-02-14) +++++++++++++++++++ + +* Added file attribute to POST and PUT requests for multipart-encode file uploads. +* Added Request.url attribute for context and redirects + + +0.2.0 (2011-02-14) +++++++++++++++++++ + +* Birth! + + +0.0.1 (2011-02-13) +++++++++++++++++++ + +* Frustration +* Conception + + diff --git a/modules/modules/requests-2.19.1.dist-info/INSTALLER b/modules/modules/requests-2.19.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/requests-2.19.1.dist-info/LICENSE.txt b/modules/modules/requests-2.19.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..2e68b82 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/LICENSE.txt @@ -0,0 +1,13 @@ +Copyright 2018 Kenneth Reitz + + 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. diff --git a/modules/modules/requests-2.19.1.dist-info/METADATA b/modules/modules/requests-2.19.1.dist-info/METADATA new file mode 100644 index 0000000..ba21618 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/METADATA @@ -0,0 +1,1721 @@ +Metadata-Version: 2.0 +Name: requests +Version: 2.19.1 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Description-Content-Type: text/x-rst +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software 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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Dist: chardet (<3.1.0,>=3.0.2) +Requires-Dist: idna (<2.8,>=2.5) +Requires-Dist: urllib3 (<1.24,>=1.21.1) +Requires-Dist: certifi (>=2017.4.17) +Provides-Extra: security +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Provides-Extra: socks +Requires-Dist: win-inet-pton; sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6") and extra == 'socks' + +Requests: HTTP for Humans +========================= + +.. image:: https://img.shields.io/pypi/v/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.org/project/requests/ + +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io + +.. image:: https://img.shields.io/github/contributors/requests/requests.svg + :target: https://github.com/requests/requests/graphs/contributors + +.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz + +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. + +.. image:: https://farm5.staticflickr.com/4317/35198386374_1939af3de6_k_d.jpg + +Behold, the power of Requests: + +.. code-block:: python + + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) + >>> r.status_code + 200 + >>> r.headers['content-type'] + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' + >>> r.text + u'{"type":"User"...' + >>> r.json() + {u'disk_usage': 368627, u'private_gists': 484, ...} + +See `the similar code, sans Requests `_. + +.. image:: https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png + :target: http://docs.python-requests.org/ + + +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the +need for manual labor. There's no need to manually add query strings to your +URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling +are 100% automatic, thanks to `urllib3 `_. + +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 downloads +every month. You don't want to be left out! + +Feature Support +--------------- + +Requests is ready for today's web. + +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- ``.netrc`` Support +- Chunked Requests + +Requests officially supports Python 2.7 & 3.4–3.6, and runs great on PyPy. + +Installation +------------ + +To install Requests, simply use `pipenv `_ (or pip, of course): + +.. code-block:: bash + + $ pipenv install requests + ✨🍰✨ + +Satisfaction guaranteed. + +Documentation +------------- + +Fantastic documentation is available at http://docs.python-requests.org/, for a limited time only. + + +How to Contribute +----------------- + +#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. +#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). +#. Write a test which shows that the bug was fixed or that the feature works as expected. +#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. + +.. _`the repository`: https://github.com/requests/requests +.. _AUTHORS: https://github.com/requests/requests/blob/master/AUTHORS.rst +.. _Contributor Friendly: https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open + + +.. :changelog: + +Release History +--------------- + +dev ++++ + +- [Short description of non-trivial change.] + +2.19.1 (2018-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed issue where status_codes.py's ``init`` function failed trying to append to + a ``__doc__`` value of ``None``. + +2.19.0 (2018-06-12) ++++++++++++++++++++ + +**Improvements** + +- Warn user about possible slowdown when using cryptography version < 1.3.4 +- Check for invalid host in proxy URL, before forwarding request to adapter. +- Fragments are now properly maintained across redirects. (RFC7231 7.1.2) +- Removed use of cgi module to expedite library load time. +- Added support for SHA-256 and SHA-512 digest auth algorithms. +- Minor performance improvement to ``Request.content``. +- Migrate to using collections.abc for 3.7 compatibility. + +**Bugfixes** + +- Parsing empty ``Link`` headers with ``parse_header_links()`` no longer return one bogus entry. +- Fixed issue where loading the default certificate bundle from a zip archive + would raise an ``IOError``. +- Fixed issue with unexpected ``ImportError`` on windows system which do not support ``winreg`` module. +- DNS resolution in proxy bypass no longer includes the username and password in + the request. This also fixes the issue of DNS queries failing on macOS. +- Properly normalize adapter prefixes for url comparison. +- Passing ``None`` as a file pointer to the ``files`` param no longer raises an exception. +- Calling ``copy`` on a ``RequestsCookieJar`` will now preserve the cookie policy correctly. + +**Dependencies** + +- We now support idna v2.7. +- We now support urllib3 v1.23. + +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**Improvements** + +- Error messages for invalid headers now include the header name for easier debugging + +**Dependencies** + +- We now support idna v2.6. + +2.18.3 (2017-08-02) ++++++++++++++++++++ + +**Improvements** + +- Running ``$ python -m requests.help`` now includes the installed version of idna. + +**Bugfixes** + +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encountering SSL problems when using urllib3 v1.22. + +2.18.2 (2017-07-25) ++++++++++++++++++++ + +**Bugfixes** + +- ``requests.help`` no longer fails on Python 2.6 due to the absence of + ``ssl.OPENSSL_VERSION_NUMBER``. + +**Dependencies** + +- We now support urllib3 v1.22. + +2.18.1 (2017-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fix an error in the packaging whereby the ``*.whl`` contained incorrect data + that regressed the fix in v2.17.3. + +2.18.0 (2017-06-14) ++++++++++++++++++++ + +**Improvements** + +- ``Response`` is now a context manager, so can be used directly in a ``with`` statement + without first having to be wrapped by ``contextlib.closing()``. + +**Bugfixes** + +- Resolve installation failure if multiprocessing is not available +- Resolve tests crash if multiprocessing is not able to determine the number of CPU cores +- Resolve error swallowing in utils set_environ generator + + +2.17.3 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.2 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.1 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.0 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Removal of the 301 redirect cache. This improves thread-safety. + + +2.16.5 (2017-05-28) ++++++++++++++++++++ + +- Improvements to ``$ python -m requests.help``. + +2.16.4 (2017-05-27) ++++++++++++++++++++ + +- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers! + +2.16.3 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +2.16.2 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +No code modification (noted below) should be necessary any longer. + +2.16.1 (2017-05-27) ++++++++++++++++++++ + +- Restored the ``requests.packages`` namespace for compatibility reasons. +- Bugfix for ``urllib3`` version parsing. + +**Note**: code that was written to import against the ``requests.packages`` +namespace previously will have to import code that rests at this module-level +now. + +For example:: + + from requests.packages.urllib3.poolmanager import PoolManager + +Will need to be re-written to be:: + + from requests.packages import urllib3 + urllib3.poolmanager.PoolManager + +Or, even better:: + + from urllib3.poolmanager import PoolManager + +2.16.0 (2017-05-26) ++++++++++++++++++++ + +- Unvendor ALL the things! + +2.15.1 (2017-05-26) ++++++++++++++++++++ + +- Everyone makes mistakes. + +2.15.0 (2017-05-26) ++++++++++++++++++++ + +**Improvements** + +- Introduction of the ``Response.next`` property, for getting the next + ``PreparedResponse`` from a redirect chain (when ``allow_redirects=False``). +- Internal refactoring of ``__version__`` module. + +**Bugfixes** + +- Restored once-optional parameter for ``requests.utils.get_environ_proxies()``. + +2.14.2 (2017-05-10) ++++++++++++++++++++ + +**Bugfixes** + +- Changed a less-than to an equal-to and an or in the dependency markers to + widen compatibility with older setuptools releases. + +2.14.1 (2017-05-09) ++++++++++++++++++++ + +**Bugfixes** + +- Changed the dependency markers to widen compatibility with older pip + releases. + +2.14.0 (2017-05-09) ++++++++++++++++++++ + +**Improvements** + +- It is now possible to pass ``no_proxy`` as a key to the ``proxies`` + dictionary to provide handling similar to the ``NO_PROXY`` environment + variable. +- When users provide invalid paths to certificate bundle files or directories + Requests now raises ``IOError``, rather than failing at the time of the HTTPS + request with a fairly inscrutable certificate validation error. +- The behavior of ``SessionRedirectMixin`` was slightly altered. + ``resolve_redirects`` will now detect a redirect by calling + ``get_redirect_target(response)`` instead of directly + querying ``Response.is_redirect`` and ``Response.headers['location']``. + Advanced users will be able to process malformed redirects more easily. +- Changed the internal calculation of elapsed request time to have higher + resolution on Windows. +- Added ``win_inet_pton`` as conditional dependency for the ``[socks]`` extra + on Windows with Python 2.7. +- Changed the proxy bypass implementation on Windows: the proxy bypass + check doesn't use forward and reverse DNS requests anymore +- URLs with schemes that begin with ``http`` but are not ``http`` or ``https`` + no longer have their host parts forced to lowercase. + +**Bugfixes** + +- Much improved handling of non-ASCII ``Location`` header values in redirects. + Fewer ``UnicodeDecodeErrors`` are encountered on Python 2, and Python 3 now + correctly understands that Latin-1 is unlikely to be the correct encoding. +- If an attempt to ``seek`` file to find out its length fails, we now + appropriately handle that by aborting our content-length calculations. +- Restricted ``HTTPDigestAuth`` to only respond to auth challenges made on 4XX + responses, rather than to all auth challenges. +- Fixed some code that was firing ``DeprecationWarning`` on Python 3.6. +- The dismayed person emoticon (``/o\\``) no longer has a big head. I'm sure + this is what you were all worrying about most. + + +**Miscellaneous** + +- Updated bundled urllib3 to v1.21.1. +- Updated bundled chardet to v3.0.2. +- Updated bundled idna to v2.5. +- Updated bundled certifi to 2017.4.17. + +2.13.0 (2017-01-24) ++++++++++++++++++++ + +**Features** + +- Only load the ``idna`` library when we've determined we need it. This will + save some memory for users. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.20. +- Updated bundled idna to 2.2. + +2.12.5 (2017-01-18) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed an issue with JSON encoding detection, specifically detecting + big-endian UTF-32 with BOM. + +2.12.4 (2016-12-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from 2.12.2 where non-string types were rejected in the + basic auth parameters. While support for this behaviour has been readded, + the behaviour is deprecated and will be removed in the future. + +2.12.3 (2016-12-01) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from v2.12.1 for URLs with schemes that begin with "http". + These URLs have historically been processed as though they were HTTP-schemed + URLs, and so have had parameters added. This was removed in v2.12.2 in an + overzealous attempt to resolve problems with IDNA-encoding those URLs. This + change was reverted: the other fixes for IDNA-encoding have been judged to + be sufficient to return to the behaviour Requests had before v2.12.0. + +2.12.2 (2016-11-30) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed several issues with IDNA-encoding URLs that are technically invalid but + which are widely accepted. Requests will now attempt to IDNA-encode a URL if + it can but, if it fails, and the host contains only ASCII characters, it will + be passed through optimistically. This will allow users to opt-in to using + IDNA2003 themselves if they want to, and will also allow technically invalid + but still common hostnames. +- Fixed an issue where URLs with leading whitespace would raise + ``InvalidSchema`` errors. +- Fixed an issue where some URLs without the HTTP or HTTPS schemes would still + have HTTP URL preparation applied to them. +- Fixed an issue where Unicode strings could not be used in basic auth. +- Fixed an issue encountered by some Requests plugins where constructing a + Response object would cause ``Response.content`` to raise an + ``AttributeError``. + +2.12.1 (2016-11-16) ++++++++++++++++++++ + +**Bugfixes** + +- Updated setuptools 'security' extra for the new PyOpenSSL backend in urllib3. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19.1. + +2.12.0 (2016-11-15) ++++++++++++++++++++ + +**Improvements** + +- Updated support for internationalized domain names from IDNA2003 to IDNA2008. + This updated support is required for several forms of IDNs and is mandatory + for .de domains. +- Much improved heuristics for guessing content lengths: Requests will no + longer read an entire ``StringIO`` into memory. +- Much improved logic for recalculating ``Content-Length`` headers for + ``PreparedRequest`` objects. +- Improved tolerance for file-like objects that have no ``tell`` method but + do have a ``seek`` method. +- Anything that is a subclass of ``Mapping`` is now treated like a dictionary + by the ``data=`` keyword argument. +- Requests now tolerates empty passwords in proxy credentials, rather than + stripping the credentials. +- If a request is made with a file-like object as the body and that request is + redirected with a 307 or 308 status code, Requests will now attempt to + rewind the body object so it can be replayed. + +**Bugfixes** + +- When calling ``response.close``, the call to ``close`` will be propagated + through to non-urllib3 backends. +- Fixed issue where the ``ALL_PROXY`` environment variable would be preferred + over scheme-specific variables like ``HTTP_PROXY``. +- Fixed issue where non-UTF8 reason phrases got severely mangled by falling + back to decoding using ISO 8859-1 instead. +- Fixed a bug where Requests would not correctly correlate cookies set when + using custom Host headers if those Host headers did not use the native + string type for the platform. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19. +- Updated bundled certifi certs to 2016.09.26. + +2.11.1 (2016-08-17) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed a bug when using ``iter_content`` with ``decode_unicode=True`` for + streamed bodies would raise ``AttributeError``. This bug was introduced in + 2.11. +- Strip Content-Type and Transfer-Encoding headers from the header block when + following a redirect that transforms the verb from POST/PUT to GET. + +2.11.0 (2016-08-08) ++++++++++++++++++++ + +**Improvements** + +- Added support for the ``ALL_PROXY`` environment variable. +- Reject header values that contain leading whitespace or newline characters to + reduce risk of header smuggling. + +**Bugfixes** + +- Fixed occasional ``TypeError`` when attempting to decode a JSON response that + occurred in an error case. Now correctly returns a ``ValueError``. +- Requests would incorrectly ignore a non-CIDR IP address in the ``NO_PROXY`` + environment variables: Requests now treats it as a specific IP. +- Fixed a bug when sending JSON data that could cause us to encounter obscure + OpenSSL errors in certain network conditions (yes, really). +- Added type checks to ensure that ``iter_content`` only accepts integers and + ``None`` for chunk sizes. +- Fixed issue where responses whose body had not been fully consumed would have + the underlying connection closed but not returned to the connection pool, + which could cause Requests to hang in situations where the ``HTTPAdapter`` + had been configured to use a blocking connection pool. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.16. +- Some previous releases accidentally accepted non-strings as acceptable header values. This release does not. + +2.10.0 (2016-04-29) ++++++++++++++++++++ + +**New Features** + +- SOCKS Proxy Support! (requires PySocks; ``$ pip install requests[socks]``) + +**Miscellaneous** + +- Updated bundled urllib3 to 1.15.1. + +2.9.2 (2016-04-29) +++++++++++++++++++ + +**Improvements** + +- Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict + as its underlying datastore. + +**Bugfixes** + +- Don't use redirect_cache if allow_redirects=False +- When passed objects that throw exceptions from ``tell()``, send them via + chunked transfer encoding instead of failing. +- Raise a ProxyError for proxy related connection issues. + +2.9.1 (2015-12-21) +++++++++++++++++++ + +**Bugfixes** + +- Resolve regression introduced in 2.9.0 that made it impossible to send binary + strings as bodies in Python 3. +- Fixed errors when calculating cookie expiration dates in certain locales. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.13.1. + +2.9.0 (2015-12-15) +++++++++++++++++++ + +**Minor Improvements** (Backwards compatible) + +- The ``verify`` keyword argument now supports being passed a path to a + directory of CA certificates, not just a single-file bundle. +- Warnings are now emitted when sending files opened in text mode. +- Added the 511 Network Authentication Required status code to the status code + registry. + +**Bugfixes** + +- For file-like objects that are not seeked to the very beginning, we now + send the content length for the number of bytes we will actually read, rather + than the total size of the file, allowing partial file uploads. +- When uploading file-like objects, if they are empty or have no obvious + content length we set ``Transfer-Encoding: chunked`` rather than + ``Content-Length: 0``. +- We correctly receive the response in buffered mode when uploading chunked + bodies. +- We now handle being passed a query string as a bytestring on Python 3, by + decoding it as UTF-8. +- Sessions are now closed in all cases (exceptional and not) when using the + functional API rather than leaking and waiting for the garbage collector to + clean them up. +- Correctly handle digest auth headers with a malformed ``qop`` directive that + contains no token, by treating it the same as if no ``qop`` directive was + provided at all. +- Minor performance improvements when removing specific cookies by name. + +**Miscellaneous** + +- Updated urllib3 to 1.13. + +2.8.1 (2015-10-13) +++++++++++++++++++ + +**Bugfixes** + +- Update certificate bundle to match ``certifi`` 2015.9.6.2's weak certificate + bundle. +- Fix a bug in 2.8.0 where requests would raise ``ConnectTimeout`` instead of + ``ConnectionError`` +- When using the PreparedRequest flow, requests will now correctly respect the + ``json`` parameter. Broken in 2.8.0. +- When using the PreparedRequest flow, requests will now correctly handle a + Unicode-string method name on Python 2. Broken in 2.8.0. + +2.8.0 (2015-10-05) +++++++++++++++++++ + +**Minor Improvements** (Backwards Compatible) + +- Requests now supports per-host proxies. This allows the ``proxies`` + dictionary to have entries of the form + ``{'://': ''}``. Host-specific proxies will be used + in preference to the previously-supported scheme-specific ones, but the + previous syntax will continue to work. +- ``Response.raise_for_status`` now prints the URL that failed as part of the + exception message. +- ``requests.utils.get_netrc_auth`` now takes an ``raise_errors`` kwarg, + defaulting to ``False``. When ``True``, errors parsing ``.netrc`` files cause + exceptions to be thrown. +- Change to bundled projects import logic to make it easier to unbundle + requests downstream. +- Changed the default User-Agent string to avoid leaking data on Linux: now + contains only the requests version. + +**Bugfixes** + +- The ``json`` parameter to ``post()`` and friends will now only be used if + neither ``data`` nor ``files`` are present, consistent with the + documentation. +- We now ignore empty fields in the ``NO_PROXY`` environment variable. +- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining + ``stream=True`` with ``contextlib.closing``. +- Prevented bugs where we would attempt to return the same connection back to + the connection pool twice when sending a Chunked body. +- Miscellaneous minor internal changes. +- Digest Auth support is now thread safe. + +**Updates** + +- Updated urllib3 to 1.12. + +2.7.0 (2015-05-03) +++++++++++++++++++ + +This is the first release that follows our new release process. For more, see +`our documentation +`_. + +**Bugfixes** + +- Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer + encoding and response framing. + +2.6.2 (2015-04-23) +++++++++++++++++++ + +**Bugfixes** + +- Fix regression where compressed data that was sent as chunked data was not + properly decompressed. (#2561) + +2.6.1 (2015-04-22) +++++++++++++++++++ + +**Bugfixes** + +- Remove VendorAlias import machinery introduced in v2.5.2. + +- Simplify the PreparedRequest.prepare API: We no longer require the user to + pass an empty list to the hooks keyword argument. (c.f. #2552) + +- Resolve redirects now receives and forwards all of the original arguments to + the adapter. (#2503) + +- Handle UnicodeDecodeErrors when trying to deal with a unicode URL that + cannot be encoded in ASCII. (#2540) + +- Populate the parsed path of the URI field when performing Digest + Authentication. (#2426) + +- Copy a PreparedRequest's CookieJar more reliably when it is not an instance + of RequestsCookieJar. (#2527) + +2.6.0 (2015-03-14) +++++++++++++++++++ + +**Bugfixes** + +- CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie + without a host value set would use the hostname for the redirected URL + exposing requests users to session fixation attacks and potentially cookie + stealing. This was disclosed privately by Matthew Daley of + `BugFuzz `_. This affects all versions of requests from + v2.1.0 to v2.5.3 (inclusive on both ends). + +- Fix error when requests is an ``install_requires`` dependency and ``python + setup.py test`` is run. (#2462) + +- Fix error when urllib3 is unbundled and requests continues to use the + vendored import location. + +- Include fixes to ``urllib3``'s header handling. + +- Requests' handling of unvendored dependencies is now more restrictive. + +**Features and Improvements** + +- Support bytearrays when passed as parameters in the ``files`` argument. + (#2468) + +- Avoid data duplication when creating a request with ``str``, ``bytes``, or + ``bytearray`` input to the ``files`` argument. + +2.5.3 (2015-02-24) +++++++++++++++++++ + +**Bugfixes** + +- Revert changes to our vendored certificate bundle. For more context see + (#2455, #2456, and http://bugs.python.org/issue23476) + +2.5.2 (2015-02-23) +++++++++++++++++++ + +**Features and Improvements** + +- Add sha256 fingerprint support. (`shazow/urllib3#540`_) + +- Improve the performance of headers. (`shazow/urllib3#544`_) + +**Bugfixes** + +- Copy pip's import machinery. When downstream redistributors remove + requests.packages.urllib3 the import machinery will continue to let those + same symbols work. Example usage in requests' documentation and 3rd-party + libraries relying on the vendored copies of urllib3 will work without having + to fallback to the system urllib3. + +- Attempt to quote parts of the URL on redirect if unquoting and then quoting + fails. (#2356) + +- Fix filename type check for multipart form-data uploads. (#2411) + +- Properly handle the case where a server issuing digest authentication + challenges provides both auth and auth-int qop-values. (#2408) + +- Fix a socket leak. (`shazow/urllib3#549`_) + +- Fix multiple ``Set-Cookie`` headers properly. (`shazow/urllib3#534`_) + +- Disable the built-in hostname verification. (`shazow/urllib3#526`_) + +- Fix the behaviour of decoding an exhausted stream. (`shazow/urllib3#535`_) + +**Security** + +- Pulled in an updated ``cacert.pem``. + +- Drop RC4 from the default cipher list. (`shazow/urllib3#551`_) + +.. _shazow/urllib3#551: https://github.com/shazow/urllib3/pull/551 +.. _shazow/urllib3#549: https://github.com/shazow/urllib3/pull/549 +.. _shazow/urllib3#544: https://github.com/shazow/urllib3/pull/544 +.. _shazow/urllib3#540: https://github.com/shazow/urllib3/pull/540 +.. _shazow/urllib3#535: https://github.com/shazow/urllib3/pull/535 +.. _shazow/urllib3#534: https://github.com/shazow/urllib3/pull/534 +.. _shazow/urllib3#526: https://github.com/shazow/urllib3/pull/526 + +2.5.1 (2014-12-23) +++++++++++++++++++ + +**Behavioural Changes** + +- Only catch HTTPErrors in raise_for_status (#2382) + +**Bugfixes** + +- Handle LocationParseError from urllib3 (#2344) +- Handle file-like object filenames that are not strings (#2379) +- Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (#2389) + +2.5.0 (2014-12-01) +++++++++++++++++++ + +**Improvements** + +- Allow usage of urllib3's Retry object with HTTPAdapters (#2216) +- The ``iter_lines`` method on a response now accepts a delimiter with which + to split the content (#2295) + +**Behavioural Changes** + +- Add deprecation warnings to functions in requests.utils that will be removed + in 3.0 (#2309) +- Sessions used by the functional API are always closed (#2326) +- Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (#2323) + +**Bugfixes** + +- Only parse the URL once (#2353) +- Allow Content-Length header to always be overridden (#2332) +- Properly handle files in HTTPDigestAuth (#2333) +- Cap redirect_cache size to prevent memory abuse (#2299) +- Fix HTTPDigestAuth handling of redirects after authenticating successfully + (#2253) +- Fix crash with custom method parameter to Session.request (#2317) +- Fix how Link headers are parsed using the regular expression library (#2271) + +**Documentation** + +- Add more references for interlinking (#2348) +- Update CSS for theme (#2290) +- Update width of buttons and sidebar (#2289) +- Replace references of Gittip with Gratipay (#2282) +- Add link to changelog in sidebar (#2273) + +2.4.3 (2014-10-06) +++++++++++++++++++ + +**Bugfixes** + +- Unicode URL improvements for Python 2. +- Re-order JSON param for backwards compat. +- Automatically defrag authentication schemes from host/pass URIs. (`#2249 `_) + + +2.4.2 (2014-10-05) +++++++++++++++++++ + +**Improvements** + +- FINALLY! Add json parameter for uploads! (`#2258 `_) +- Support for bytestring URLs on Python 3.x (`#2238 `_) + +**Bugfixes** + +- Avoid getting stuck in a loop (`#2244 `_) +- Multiple calls to iter* fail with unhelpful error. (`#2240 `_, `#2241 `_) + +**Documentation** + +- Correct redirection introduction (`#2245 `_) +- Added example of how to send multiple files in one request. (`#2227 `_) +- Clarify how to pass a custom set of CAs (`#2248 `_) + + + +2.4.1 (2014-09-09) +++++++++++++++++++ + +- Now has a "security" package extras set, ``$ pip install requests[security]`` +- Requests will now use Certifi if it is available. +- Capture and re-raise urllib3 ProtocolError +- Bugfix for responses that attempt to redirect to themselves forever (wtf?). + + +2.4.0 (2014-08-29) +++++++++++++++++++ + +**Behavioral Changes** + +- ``Connection: keep-alive`` header is now sent automatically. + +**Improvements** + +- Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts. +- Allow copying of PreparedRequests without headers/cookies. +- Updated bundled urllib3 version. +- Refactored settings loading from environment -- new `Session.merge_environment_settings`. +- Handle socket errors in iter_content. + + +2.3.0 (2014-05-16) +++++++++++++++++++ + +**API Changes** + +- New ``Response`` property ``is_redirect``, which is true when the + library could have processed this response as a redirection (whether + or not it actually did). +- The ``timeout`` parameter now affects requests with both ``stream=True`` and + ``stream=False`` equally. +- The change in v2.0.0 to mandate explicit proxy schemes has been reverted. + Proxy schemes now default to ``http://``. +- The ``CaseInsensitiveDict`` used for HTTP headers now behaves like a normal + dictionary when references as string or viewed in the interpreter. + +**Bugfixes** + +- No longer expose Authorization or Proxy-Authorization headers on redirect. + Fix CVE-2014-1829 and CVE-2014-1830 respectively. +- Authorization is re-evaluated each redirect. +- On redirect, pass url as native strings. +- Fall-back to autodetected encoding for JSON when Unicode detection fails. +- Headers set to ``None`` on the ``Session`` are now correctly not sent. +- Correctly honor ``decode_unicode`` even if it wasn't used earlier in the same + response. +- Stop advertising ``compress`` as a supported Content-Encoding. +- The ``Response.history`` parameter is now always a list. +- Many, many ``urllib3`` bugfixes. + +2.2.1 (2014-01-23) +++++++++++++++++++ + +**Bugfixes** + +- Fixes incorrect parsing of proxy credentials that contain a literal or encoded '#' character. +- Assorted urllib3 fixes. + +2.2.0 (2014-01-09) +++++++++++++++++++ + +**API Changes** + +- New exception: ``ContentDecodingError``. Raised instead of ``urllib3`` + ``DecodeError`` exceptions. + +**Bugfixes** + +- Avoid many many exceptions from the buggy implementation of ``proxy_bypass`` on OS X in Python 2.6. +- Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory. +- Use the correct pool size for pools of connections to proxies. +- Fix iteration of ``CookieJar`` objects. +- Ensure that cookies are persisted over redirect. +- Switch back to using chardet, since it has merged with charade. + +2.1.0 (2013-12-05) +++++++++++++++++++ + +- Updated CA Bundle, of course. +- Cookies set on individual Requests through a ``Session`` (e.g. via ``Session.get()``) are no longer persisted to the ``Session``. +- Clean up connections when we hit problems during chunked upload, rather than leaking them. +- Return connections to the pool when a chunked upload is successful, rather than leaking it. +- Match the HTTPbis recommendation for HTTP 301 redirects. +- Prevent hanging when using streaming uploads and Digest Auth when a 401 is received. +- Values of headers set by Requests are now always the native string type. +- Fix previously broken SNI support. +- Fix accessing HTTP proxies using proxy authentication. +- Unencode HTTP Basic usernames and passwords extracted from URLs. +- Support for IP address ranges for no_proxy environment variable +- Parse headers correctly when users override the default ``Host:`` header. +- Avoid munging the URL in case of case-sensitive servers. +- Looser URL handling for non-HTTP/HTTPS urls. +- Accept unicode methods in Python 2.6 and 2.7. +- More resilient cookie handling. +- Make ``Response`` objects pickleable. +- Actually added MD5-sess to Digest Auth instead of pretending to like last time. +- Updated internal urllib3. +- Fixed @Lukasa's lack of taste. + +2.0.1 (2013-10-24) +++++++++++++++++++ + +- Updated included CA Bundle with new mistrusts and automated process for the future +- Added MD5-sess to Digest Auth +- Accept per-file headers in multipart file POST messages. +- Fixed: Don't send the full URL on CONNECT messages. +- Fixed: Correctly lowercase a redirect scheme. +- Fixed: Cookies not persisted when set via functional API. +- Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. +- Updated internal urllib3 and chardet. + +2.0.0 (2013-09-24) +++++++++++++++++++ + +**API Changes:** + +- Keys in the Headers dictionary are now native strings on all Python versions, + i.e. bytestrings on Python 2, unicode on Python 3. +- Proxy URLs now *must* have an explicit scheme. A ``MissingSchema`` exception + will be raised if they don't. +- Timeouts now apply to read time if ``Stream=False``. +- ``RequestException`` is now a subclass of ``IOError``, not ``RuntimeError``. +- Added new method to ``PreparedRequest`` objects: ``PreparedRequest.copy()``. +- Added new method to ``Session`` objects: ``Session.update_request()``. This + method updates a ``Request`` object with the data (e.g. cookies) stored on + the ``Session``. +- Added new method to ``Session`` objects: ``Session.prepare_request()``. This + method updates and prepares a ``Request`` object, and returns the + corresponding ``PreparedRequest`` object. +- Added new method to ``HTTPAdapter`` objects: ``HTTPAdapter.proxy_headers()``. + This should not be called directly, but improves the subclass interface. +- ``httplib.IncompleteRead`` exceptions caused by incorrect chunked encoding + will now raise a Requests ``ChunkedEncodingError`` instead. +- Invalid percent-escape sequences now cause a Requests ``InvalidURL`` + exception to be raised. +- HTTP 208 no longer uses reason phrase ``"im_used"``. Correctly uses + ``"already_reported"``. +- HTTP 226 reason added (``"im_used"``). + +**Bugfixes:** + +- Vastly improved proxy support, including the CONNECT verb. Special thanks to + the many contributors who worked towards this improvement. +- Cookies are now properly managed when 401 authentication responses are + received. +- Chunked encoding fixes. +- Support for mixed case schemes. +- Better handling of streaming downloads. +- Retrieve environment proxies from more locations. +- Minor cookies fixes. +- Improved redirect behaviour. +- Improved streaming behaviour, particularly for compressed data. +- Miscellaneous small Python 3 text encoding bugs. +- ``.netrc`` no longer overrides explicit auth. +- Cookies set by hooks are now correctly persisted on Sessions. +- Fix problem with cookies that specify port numbers in their host field. +- ``BytesIO`` can be used to perform streaming uploads. +- More generous parsing of the ``no_proxy`` environment variable. +- Non-string objects can be passed in data values alongside files. + +1.2.3 (2013-05-25) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.2 (2013-05-23) +++++++++++++++++++ + +- Simple packaging fix + + +1.2.1 (2013-05-20) +++++++++++++++++++ + +- 301 and 302 redirects now change the verb to GET for all verbs, not just + POST, improving browser compatibility. +- Python 3.3.2 compatibility +- Always percent-encode location headers +- Fix connection adapter matching to be most-specific first +- new argument to the default connection adapter for passing a block argument +- prevent a KeyError when there's no link headers + +1.2.0 (2013-03-31) +++++++++++++++++++ + +- Fixed cookies on sessions and on requests +- Significantly change how hooks are dispatched - hooks now receive all the + arguments specified by the user when making a request so hooks can make a + secondary request with the same parameters. This is especially necessary for + authentication handler authors +- certifi support was removed +- Fixed bug where using OAuth 1 with body ``signature_type`` sent no data +- Major proxy work thanks to @Lukasa including parsing of proxy authentication + from the proxy url +- Fix DigestAuth handling too many 401s +- Update vendored urllib3 to include SSL bug fixes +- Allow keyword arguments to be passed to ``json.loads()`` via the + ``Response.json()`` method +- Don't send ``Content-Length`` header by default on ``GET`` or ``HEAD`` + requests +- Add ``elapsed`` attribute to ``Response`` objects to time how long a request + took. +- Fix ``RequestsCookieJar`` +- Sessions and Adapters are now picklable, i.e., can be used with the + multiprocessing library +- Update charade to version 1.0.3 + +The change in how hooks are dispatched will likely cause a great deal of +issues. + +1.1.0 (2013-01-10) +++++++++++++++++++ + +- CHUNKED REQUESTS +- Support for iterable response bodies +- Assume servers persist redirect params +- Allow explicit content types to be specified for file data +- Make merge_kwargs case-insensitive when looking up keys + +1.0.3 (2012-12-18) +++++++++++++++++++ + +- Fix file upload encoding bug +- Fix cookie behavior + +1.0.2 (2012-12-17) +++++++++++++++++++ + +- Proxy fix for HTTPAdapter. + +1.0.1 (2012-12-17) +++++++++++++++++++ + +- Cert verification exception bug. +- Proxy fix for HTTPAdapter. + +1.0.0 (2012-12-17) +++++++++++++++++++ + +- Massive Refactor and Simplification +- Switch to Apache 2.0 license +- Swappable Connection Adapters +- Mountable Connection Adapters +- Mutable ProcessedRequest chain +- /s/prefetch/stream +- Removal of all configuration +- Standard library logging +- Make Response.json() callable, not property. +- Usage of new charade project, which provides python 2 and 3 simultaneous chardet. +- Removal of all hooks except 'response' +- Removal of all authentication helpers (OAuth, Kerberos) + +This is not a backwards compatible change. + +0.14.2 (2012-10-27) ++++++++++++++++++++ + +- Improved mime-compatible JSON handling +- Proxy fixes +- Path hack fixes +- Case-Insensitive Content-Encoding headers +- Support for CJK parameters in form posts + + +0.14.1 (2012-10-01) ++++++++++++++++++++ + +- Python 3.3 Compatibility +- Simply default accept-encoding +- Bugfixes + + +0.14.0 (2012-09-02) +++++++++++++++++++++ + +- No more iter_content errors if already downloaded. + +0.13.9 (2012-08-25) ++++++++++++++++++++ + +- Fix for OAuth + POSTs +- Remove exception eating from dispatch_hook +- General bugfixes + +0.13.8 (2012-08-21) ++++++++++++++++++++ + +- Incredible Link header support :) + +0.13.7 (2012-08-19) ++++++++++++++++++++ + +- Support for (key, value) lists everywhere. +- Digest Authentication improvements. +- Ensure proxy exclusions work properly. +- Clearer UnicodeError exceptions. +- Automatic casting of URLs to strings (fURL and such) +- Bugfixes. + +0.13.6 (2012-08-06) ++++++++++++++++++++ + +- Long awaited fix for hanging connections! + +0.13.5 (2012-07-27) ++++++++++++++++++++ + +- Packaging fix + +0.13.4 (2012-07-27) ++++++++++++++++++++ + +- GSSAPI/Kerberos authentication! +- App Engine 2.7 Fixes! +- Fix leaking connections (from urllib3 update) +- OAuthlib path hack fix +- OAuthlib URL parameters fix. + +0.13.3 (2012-07-12) ++++++++++++++++++++ + +- Use simplejson if available. +- Do not hide SSLErrors behind Timeouts. +- Fixed param handling with urls containing fragments. +- Significantly improved information in User Agent. +- client certificates are ignored when verify=False + +0.13.2 (2012-06-28) ++++++++++++++++++++ + +- Zero dependencies (once again)! +- New: Response.reason +- Sign querystring parameters in OAuth 1.0 +- Client certificates no longer ignored when verify=False +- Add openSUSE certificate support + +0.13.1 (2012-06-07) ++++++++++++++++++++ + +- Allow passing a file or file-like object as data. +- Allow hooks to return responses that indicate errors. +- Fix Response.text and Response.json for body-less responses. + +0.13.0 (2012-05-29) ++++++++++++++++++++ + +- Removal of Requests.async in favor of `grequests `_ +- Allow disabling of cookie persistence. +- New implementation of safe_mode +- cookies.get now supports default argument +- Session cookies not saved when Session.request is called with return_response=False +- Env: no_proxy support. +- RequestsCookieJar improvements. +- Various bug fixes. + +0.12.1 (2012-05-08) ++++++++++++++++++++ + +- New ``Response.json`` property. +- Ability to add string file uploads. +- Fix out-of-range issue with iter_lines. +- Fix iter_content default size. +- Fix POST redirects containing files. + +0.12.0 (2012-05-02) ++++++++++++++++++++ + +- EXPERIMENTAL OAUTH SUPPORT! +- Proper CookieJar-backed cookies interface with awesome dict-like interface. +- Speed fix for non-iterated content chunks. +- Move ``pre_request`` to a more usable place. +- New ``pre_send`` hook. +- Lazily encode data, params, files. +- Load system Certificate Bundle if ``certify`` isn't available. +- Cleanups, fixes. + +0.11.2 (2012-04-22) ++++++++++++++++++++ + +- Attempt to use the OS's certificate bundle if ``certifi`` isn't available. +- Infinite digest auth redirect fix. +- Multi-part file upload improvements. +- Fix decoding of invalid %encodings in URLs. +- If there is no content in a response don't throw an error the second time that content is attempted to be read. +- Upload data on redirects. + +0.11.1 (2012-03-30) ++++++++++++++++++++ + +* POST redirects now break RFC to do what browsers do: Follow up with a GET. +* New ``strict_mode`` configuration to disable new redirect behavior. + + +0.11.0 (2012-03-14) ++++++++++++++++++++ + +* Private SSL Certificate support +* Remove select.poll from Gevent monkeypatching +* Remove redundant generator for chunked transfer encoding +* Fix: Response.ok raises Timeout Exception in safe_mode + +0.10.8 (2012-03-09) ++++++++++++++++++++ + +* Generate chunked ValueError fix +* Proxy configuration by environment variables +* Simplification of iter_lines. +* New `trust_env` configuration for disabling system/environment hints. +* Suppress cookie errors. + +0.10.7 (2012-03-07) ++++++++++++++++++++ + +* `encode_uri` = False + +0.10.6 (2012-02-25) ++++++++++++++++++++ + +* Allow '=' in cookies. + +0.10.5 (2012-02-25) ++++++++++++++++++++ + +* Response body with 0 content-length fix. +* New async.imap. +* Don't fail on netrc. + + +0.10.4 (2012-02-20) ++++++++++++++++++++ + +* Honor netrc. + +0.10.3 (2012-02-20) ++++++++++++++++++++ + +* HEAD requests don't follow redirects anymore. +* raise_for_status() doesn't raise for 3xx anymore. +* Make Session objects picklable. +* ValueError for invalid schema URLs. + +0.10.2 (2012-01-15) ++++++++++++++++++++ + +* Vastly improved URL quoting. +* Additional allowed cookie key values. +* Attempted fix for "Too many open files" Error +* Replace unicode errors on first pass, no need for second pass. +* Append '/' to bare-domain urls before query insertion. +* Exceptions now inherit from RuntimeError. +* Binary uploads + auth fix. +* Bugfixes. + + +0.10.1 (2012-01-23) ++++++++++++++++++++ + +* PYTHON 3 SUPPORT! +* Dropped 2.5 Support. (*Backwards Incompatible*) + +0.10.0 (2012-01-21) ++++++++++++++++++++ + +* ``Response.content`` is now bytes-only. (*Backwards Incompatible*) +* New ``Response.text`` is unicode-only. +* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Response.text`` will guess an encoding. +* Default to ISO-8859-1 (Western) encoding for "text" subtypes. +* Removal of `decode_unicode`. (*Backwards Incompatible*) +* New multiple-hooks system. +* New ``Response.register_hook`` for registering hooks within the pipeline. +* ``Response.url`` is now Unicode. + +0.9.3 (2012-01-18) +++++++++++++++++++ + +* SSL verify=False bugfix (apparent on windows machines). + +0.9.2 (2012-01-18) +++++++++++++++++++ + +* Asynchronous async.send method. +* Support for proper chunk streams with boundaries. +* session argument for Session classes. +* Print entire hook tracebacks, not just exception instance. +* Fix response.iter_lines from pending next line. +* Fix but in HTTP-digest auth w/ URI having query strings. +* Fix in Event Hooks section. +* Urllib3 update. + + +0.9.1 (2012-01-06) +++++++++++++++++++ + +* danger_mode for automatic Response.raise_for_status() +* Response.iter_lines refactor + +0.9.0 (2011-12-28) +++++++++++++++++++ + +* verify ssl is default. + + +0.8.9 (2011-12-28) +++++++++++++++++++ + +* Packaging fix. + + +0.8.8 (2011-12-28) +++++++++++++++++++ + +* SSL CERT VERIFICATION! +* Release of Cerifi: Mozilla's cert list. +* New 'verify' argument for SSL requests. +* Urllib3 update. + +0.8.7 (2011-12-24) +++++++++++++++++++ + +* iter_lines last-line truncation fix +* Force safe_mode for async requests +* Handle safe_mode exceptions more consistently +* Fix iteration on null responses in safe_mode + +0.8.6 (2011-12-18) +++++++++++++++++++ + +* Socket timeout fixes. +* Proxy Authorization support. + +0.8.5 (2011-12-14) +++++++++++++++++++ + +* Response.iter_lines! + +0.8.4 (2011-12-11) +++++++++++++++++++ + +* Prefetch bugfix. +* Added license to installed version. + +0.8.3 (2011-11-27) +++++++++++++++++++ + +* Converted auth system to use simpler callable objects. +* New session parameter to API methods. +* Display full URL while logging. + +0.8.2 (2011-11-19) +++++++++++++++++++ + +* New Unicode decoding system, based on over-ridable `Response.encoding`. +* Proper URL slash-quote handling. +* Cookies with ``[``, ``]``, and ``_`` allowed. + +0.8.1 (2011-11-15) +++++++++++++++++++ + +* URL Request path fix +* Proxy fix. +* Timeouts fix. + +0.8.0 (2011-11-13) +++++++++++++++++++ + +* Keep-alive support! +* Complete removal of Urllib2 +* Complete removal of Poster +* Complete removal of CookieJars +* New ConnectionError raising +* Safe_mode for error catching +* prefetch parameter for request methods +* OPTION method +* Async pool size throttling +* File uploads send real names +* Vendored in urllib3 + +0.7.6 (2011-11-07) +++++++++++++++++++ + +* Digest authentication bugfix (attach query data to path) + +0.7.5 (2011-11-04) +++++++++++++++++++ + +* Response.content = None if there was an invalid response. +* Redirection auth handling. + +0.7.4 (2011-10-26) +++++++++++++++++++ + +* Session Hooks fix. + +0.7.3 (2011-10-23) +++++++++++++++++++ + +* Digest Auth fix. + + +0.7.2 (2011-10-23) +++++++++++++++++++ + +* PATCH Fix. + + +0.7.1 (2011-10-23) +++++++++++++++++++ + +* Move away from urllib2 authentication handling. +* Fully Remove AuthManager, AuthObject, &c. +* New tuple-based auth system with handler callbacks. + + +0.7.0 (2011-10-22) +++++++++++++++++++ + +* Sessions are now the primary interface. +* Deprecated InvalidMethodException. +* PATCH fix. +* New config system (no more global settings). + + +0.6.6 (2011-10-19) +++++++++++++++++++ + +* Session parameter bugfix (params merging). + + +0.6.5 (2011-10-18) +++++++++++++++++++ + +* Offline (fast) test suite. +* Session dictionary argument merging. + + +0.6.4 (2011-10-13) +++++++++++++++++++ + +* Automatic decoding of unicode, based on HTTP Headers. +* New ``decode_unicode`` setting. +* Removal of ``r.read/close`` methods. +* New ``r.faw`` interface for advanced response usage.* +* Automatic expansion of parameterized headers. + + +0.6.3 (2011-10-13) +++++++++++++++++++ + +* Beautiful ``requests.async`` module, for making async requests w/ gevent. + + +0.6.2 (2011-10-09) +++++++++++++++++++ + +* GET/HEAD obeys allow_redirects=False. + + +0.6.1 (2011-08-20) +++++++++++++++++++ + +* Enhanced status codes experience ``\o/`` +* Set a maximum number of redirects (``settings.max_redirects``) +* Full Unicode URL support +* Support for protocol-less redirects. +* Allow for arbitrary request types. +* Bugfixes + + +0.6.0 (2011-08-17) +++++++++++++++++++ + +* New callback hook system +* New persistent sessions object and context manager +* Transparent Dict-cookie handling +* Status code reference object +* Removed Response.cached +* Added Response.request +* All args are kwargs +* Relative redirect support +* HTTPError handling improvements +* Improved https testing +* Bugfixes + + +0.5.1 (2011-07-23) +++++++++++++++++++ + +* International Domain Name Support! +* Access headers without fetching entire body (``read()``) +* Use lists as dicts for parameters +* Add Forced Basic Authentication +* Forced Basic is default authentication type +* ``python-requests.org`` default User-Agent header +* CaseInsensitiveDict lower-case caching +* Response.history bugfix + + +0.5.0 (2011-06-21) +++++++++++++++++++ + +* PATCH Support +* Support for Proxies +* HTTPBin Test Suite +* Redirect Fixes +* settings.verbose stream writing +* Querystrings for all methods +* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised + ``r.requests.get('hwe://blah'); r.raise_for_status()`` + + +0.4.1 (2011-05-22) +++++++++++++++++++ + +* Improved Redirection Handling +* New 'allow_redirects' param for following non-GET/HEAD Redirects +* Settings module refactoring + + +0.4.0 (2011-05-15) +++++++++++++++++++ + +* Response.history: list of redirected responses +* Case-Insensitive Header Dictionaries! +* Unicode URLs + + +0.3.4 (2011-05-14) +++++++++++++++++++ + +* Urllib2 HTTPAuthentication Recursion fix (Basic/Digest) +* Internal Refactor +* Bytes data upload Bugfix + + + +0.3.3 (2011-05-12) +++++++++++++++++++ + +* Request timeouts +* Unicode url-encoded data +* Settings context manager and module + + +0.3.2 (2011-04-15) +++++++++++++++++++ + +* Automatic Decompression of GZip Encoded Content +* AutoAuth Support for Tupled HTTP Auth + + +0.3.1 (2011-04-01) +++++++++++++++++++ + +* Cookie Changes +* Response.read() +* Poster fix + + +0.3.0 (2011-02-25) +++++++++++++++++++ + +* Automatic Authentication API Change +* Smarter Query URL Parameterization +* Allow file uploads and POST data together +* New Authentication Manager System + - Simpler Basic HTTP System + - Supports all build-in urllib2 Auths + - Allows for custom Auth Handlers + + +0.2.4 (2011-02-19) +++++++++++++++++++ + +* Python 2.5 Support +* PyPy-c v1.4 Support +* Auto-Authentication tests +* Improved Request object constructor + +0.2.3 (2011-02-15) +++++++++++++++++++ + +* New HTTPHandling Methods + - Response.__nonzero__ (false if bad HTTP Status) + - Response.ok (True if expected HTTP Status) + - Response.error (Logged HTTPError if bad HTTP Status) + - Response.raise_for_status() (Raises stored HTTPError) + + +0.2.2 (2011-02-14) +++++++++++++++++++ + +* Still handles request in the event of an HTTPError. (Issue #2) +* Eventlet and Gevent Monkeypatch support. +* Cookie Support (Issue #1) + + +0.2.1 (2011-02-14) +++++++++++++++++++ + +* Added file attribute to POST and PUT requests for multipart-encode file uploads. +* Added Request.url attribute for context and redirects + + +0.2.0 (2011-02-14) +++++++++++++++++++ + +* Birth! + + +0.0.1 (2011-02-13) +++++++++++++++++++ + +* Frustration +* Conception + + diff --git a/modules/modules/requests-2.19.1.dist-info/RECORD b/modules/modules/requests-2.19.1.dist-info/RECORD new file mode 100644 index 0000000..dce2922 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/RECORD @@ -0,0 +1,44 @@ +requests/__init__.py,sha256=CfBVrS2i2DRqW4l_YWg0amv2aE40uzKipJOhl5f_ym4,4056 +requests/__version__.py,sha256=rJ2xgNOLhjspGkNPfgXTBctqqvsf2uJMFTaE0rlVtbI,436 +requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +requests/adapters.py,sha256=i3hSRejv346malcOuw46ivOBDxCyip0SBuMy3sylvmA,21236 +requests/api.py,sha256=zub9ENcEUT2m9gwgBgqH5RIRDfrx2kwRpZ7L6hX3mcw,6261 +requests/auth.py,sha256=oRSQkBYcLkTEssudkzoR1UW1Glb1ts3p1RWusgHf1YU,10208 +requests/certs.py,sha256=dOB5rV2DZ13dEhq9BUa_4hd5kAqg59e_zUZB00faYz8,453 +requests/compat.py,sha256=aY4WEIpX7kYXzD4h4RhcO5QwkurS79Ssg5m0fWEflMc,1723 +requests/cookies.py,sha256=olUaLeNci_z1K-Bn5PeEKllSspmQqN9-s8Ug7CasaPE,18346 +requests/exceptions.py,sha256=Q8YeWWxiHHXhkEynLpMgC_6_r_ZTYw2aITs9wCSAZNY,3185 +requests/help.py,sha256=vKOUvN6TMonwqumMjRaG9BgsYw7-Ei6aMWY71vtHCx8,3606 +requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 +requests/models.py,sha256=Eus9H6VuYZ3hkvFqpK6chs5HsU4Uhubm2k7015AeRII,34095 +requests/packages.py,sha256=Q2rF0L5mc3wQAvc6q_lAVtPTDOaOeFgD-7kWSQLkjEQ,542 +requests/sessions.py,sha256=71MK2HCadovka1vAx9dyDFWAuw69KgRPRBpd0HWSEAo,27829 +requests/status_codes.py,sha256=pgw-xlnxO5zHQWn3fKps2cxwQehKzPxEbdhIrMQe6Ec,4128 +requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +requests/utils.py,sha256=3OxbbLUQFVdm84fdBD9nduXvhw6hIzj59mhvBomKuJI,30156 +requests-2.19.1.dist-info/DESCRIPTION.rst,sha256=n_VLfuLN3E966vObL5yznSnEemZi9-mN_NYciEbtu1U,50439 +requests-2.19.1.dist-info/LICENSE.txt,sha256=gqhp_k6WdEmVbSalRq3HYqys4CiFLOgboWw8Wx12sVs,581 +requests-2.19.1.dist-info/METADATA,sha256=xyt8lFsqw5Ub6FgGyQi_zaONQ6uCh8ULkonZeblqHzg,52012 +requests-2.19.1.dist-info/RECORD,, +requests-2.19.1.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +requests-2.19.1.dist-info/metadata.json,sha256=aoLNiq-pX6UqPnwJr037D19kMMoHnl8qHmS1HFmI-zw,1768 +requests-2.19.1.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests-2.19.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests/__pycache__/adapters.cpython-36.pyc,, +requests/__pycache__/api.cpython-36.pyc,, +requests/__pycache__/auth.cpython-36.pyc,, +requests/__pycache__/certs.cpython-36.pyc,, +requests/__pycache__/compat.cpython-36.pyc,, +requests/__pycache__/cookies.cpython-36.pyc,, +requests/__pycache__/exceptions.cpython-36.pyc,, +requests/__pycache__/help.cpython-36.pyc,, +requests/__pycache__/hooks.cpython-36.pyc,, +requests/__pycache__/models.cpython-36.pyc,, +requests/__pycache__/packages.cpython-36.pyc,, +requests/__pycache__/sessions.cpython-36.pyc,, +requests/__pycache__/status_codes.cpython-36.pyc,, +requests/__pycache__/structures.cpython-36.pyc,, +requests/__pycache__/utils.cpython-36.pyc,, +requests/__pycache__/_internal_utils.cpython-36.pyc,, +requests/__pycache__/__init__.cpython-36.pyc,, +requests/__pycache__/__version__.cpython-36.pyc,, diff --git a/modules/modules/requests-2.19.1.dist-info/WHEEL b/modules/modules/requests-2.19.1.dist-info/WHEEL new file mode 100644 index 0000000..7332a41 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/requests-2.19.1.dist-info/metadata.json b/modules/modules/requests-2.19.1.dist-info/metadata.json new file mode 100644 index 0000000..c844f60 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy"], "description_content_type": "text/x-rst", "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.org", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://python-requests.org"}}}, "extras": ["security", "socks"], "generator": "bdist_wheel (0.30.0)", "license": "Apache 2.0", "metadata_version": "2.0", "name": "requests", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "run_requires": [{"extra": "socks", "requires": ["PySocks (!=1.5.7,>=1.5.6)"]}, {"requires": ["certifi (>=2017.4.17)", "chardet (<3.1.0,>=3.0.2)", "idna (<2.8,>=2.5)", "urllib3 (<1.24,>=1.21.1)"]}, {"extra": "security", "requires": ["cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)"]}, {"environment": "sys_platform == \"win32\" and (python_version == \"2.7\" or python_version == \"2.6\")", "extra": "socks", "requires": ["win-inet-pton"]}], "summary": "Python HTTP for Humans.", "test_requires": [{"requires": ["PySocks (!=1.5.7,>=1.5.6)", "pytest (>=2.8.0)", "pytest-cov", "pytest-httpbin (==0.0.7)", "pytest-mock", "pytest-xdist"]}], "version": "2.19.1"} \ No newline at end of file diff --git a/modules/modules/requests-2.19.1.dist-info/top_level.txt b/modules/modules/requests-2.19.1.dist-info/top_level.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/modules/modules/requests-2.19.1.dist-info/top_level.txt @@ -0,0 +1 @@ +requests diff --git a/modules/modules/requests-2.21.0.dist-info/INSTALLER b/modules/modules/requests-2.21.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/requests-2.21.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/requests-2.21.0.dist-info/LICENSE b/modules/modules/requests-2.21.0.dist-info/LICENSE new file mode 100644 index 0000000..841c602 --- /dev/null +++ b/modules/modules/requests-2.21.0.dist-info/LICENSE @@ -0,0 +1,13 @@ +Copyright 2018 Kenneth Reitz + + 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 + + https://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. diff --git a/modules/modules/requests-2.21.0.dist-info/METADATA b/modules/modules/requests-2.21.0.dist-info/METADATA new file mode 100644 index 0000000..2298d39 --- /dev/null +++ b/modules/modules/requests-2.21.0.dist-info/METADATA @@ -0,0 +1,146 @@ +Metadata-Version: 2.1 +Name: requests +Version: 2.21.0 +Summary: Python HTTP for Humans. +Home-page: http://python-requests.org +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache 2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: Apache Software 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 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Description-Content-Type: text/markdown +Requires-Dist: chardet (<3.1.0,>=3.0.2) +Requires-Dist: idna (<2.9,>=2.5) +Requires-Dist: urllib3 (<1.25,>=1.21.1) +Requires-Dist: certifi (>=2017.4.17) +Provides-Extra: security +Requires-Dist: pyOpenSSL (>=0.14); extra == 'security' +Requires-Dist: cryptography (>=1.3.4); extra == 'security' +Requires-Dist: idna (>=2.0.0); extra == 'security' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,>=1.5.6); extra == 'socks' +Requires-Dist: win-inet-pton; (sys_platform == "win32" and python_version == "2.7") and extra == 'socks' + +Requests: HTTP for Humans™ +========================== + +[![image](https://img.shields.io/pypi/v/requests.svg)](https://pypi.org/project/requests/) +[![image](https://img.shields.io/pypi/l/requests.svg)](https://pypi.org/project/requests/) +[![image](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests/) +[![codecov.io](https://codecov.io/github/requests/requests/coverage.svg?branch=master)](https://codecov.io/github/requests/requests) +[![image](https://img.shields.io/github/contributors/requests/requests.svg)](https://github.com/requests/requests/graphs/contributors) +[![image](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/kennethreitz) + +**If you're interested in financially supporting Kenneth Reitz open source, consider [visiting this link](https://cash.me/$KennethReitz). Your support helps tremendously with sustainability of motivation, as Open Source is no longer part of my day job.** + +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. + +![image](https://farm5.staticflickr.com/4317/35198386374_1939af3de6_k_d.jpg) + +Behold, the power of Requests: + +``` {.sourceCode .python} +>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) +>>> r.status_code +200 +>>> r.headers['content-type'] +'application/json; charset=utf8' +>>> r.encoding +'utf-8' +>>> r.text +u'{"type":"User"...' +>>> r.json() +{u'disk_usage': 368627, u'private_gists': 484, ...} +``` + +See [the similar code, sans Requests](https://gist.github.com/973705). + +[![image](https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png)](http://docs.python-requests.org/) + +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, +without the need for manual labor. There's no need to manually add query +strings to your URLs, or to form-encode your POST data. Keep-alive and +HTTP connection pooling are 100% automatic, thanks to +[urllib3](https://github.com/shazow/urllib3). + +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 +downloads every month. You don't want to be left out! + +Feature Support +--------------- + +Requests is ready for today's web. + +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- `.netrc` Support +- Chunked Requests + +Requests officially supports Python 2.7 & 3.4–3.7, and runs great on +PyPy. + +Installation +------------ + +To install Requests, simply use [pipenv](http://pipenv.org/) (or pip, of +course): + +``` {.sourceCode .bash} +$ pipenv install requests +✨🍰✨ +``` + +Satisfaction guaranteed. + +Documentation +------------- + +Fantastic documentation is available at +, for a limited time only. + +How to Contribute +----------------- + +1. Check for open issues or open a fresh issue to start a discussion + around a feature idea or a bug. There is a [Contributor + Friendly](https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open) + tag for issues that should be ideal for people who are not very + familiar with the codebase yet. +2. Fork [the repository](https://github.com/requests/requests) on + GitHub to start making your changes to the **master** branch (or + branch off of it). +3. Write a test which shows that the bug was fixed or that the feature + works as expected. +4. Send a pull request and bug the maintainer until it gets merged and + published. :) Make sure to add yourself to + [AUTHORS](https://github.com/requests/requests/blob/master/AUTHORS.rst). + + + diff --git a/modules/modules/requests-2.21.0.dist-info/RECORD b/modules/modules/requests-2.21.0.dist-info/RECORD new file mode 100644 index 0000000..c8b15ab --- /dev/null +++ b/modules/modules/requests-2.21.0.dist-info/RECORD @@ -0,0 +1,42 @@ +requests-2.21.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests-2.21.0.dist-info/LICENSE,sha256=vkGrrCxA-FMDB-jRcsWQtHb0pIi8amj43le3z2R4Zoc,582 +requests-2.21.0.dist-info/METADATA,sha256=gZqDct4z6ApQGC0CEd3YZfXpEQSbCUUaTjJl2MWOBPY,5544 +requests-2.21.0.dist-info/RECORD,, +requests-2.21.0.dist-info/WHEEL,sha256=CihQvCnsGZQBGAHLEUMf0IdA4fRduS_NBUTMgCTtvPM,110 +requests-2.21.0.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests/__init__.py,sha256=ougM9-ENoK_0KBvK4f55JMu8hOmAvcZmluoYD4whoZU,3921 +requests/__pycache__/__init__.cpython-36.pyc,, +requests/__pycache__/__version__.cpython-36.pyc,, +requests/__pycache__/_internal_utils.cpython-36.pyc,, +requests/__pycache__/adapters.cpython-36.pyc,, +requests/__pycache__/api.cpython-36.pyc,, +requests/__pycache__/auth.cpython-36.pyc,, +requests/__pycache__/certs.cpython-36.pyc,, +requests/__pycache__/compat.cpython-36.pyc,, +requests/__pycache__/cookies.cpython-36.pyc,, +requests/__pycache__/exceptions.cpython-36.pyc,, +requests/__pycache__/help.cpython-36.pyc,, +requests/__pycache__/hooks.cpython-36.pyc,, +requests/__pycache__/models.cpython-36.pyc,, +requests/__pycache__/packages.cpython-36.pyc,, +requests/__pycache__/sessions.cpython-36.pyc,, +requests/__pycache__/status_codes.cpython-36.pyc,, +requests/__pycache__/structures.cpython-36.pyc,, +requests/__pycache__/utils.cpython-36.pyc,, +requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436 +requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +requests/adapters.py,sha256=WelSM1BCQXdbjEuDsBxqKDADeY8BHmxlrwbNnLN2rr4,21344 +requests/api.py,sha256=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253 +requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +requests/certs.py,sha256=dOB5rV2DZ13dEhq9BUa_4hd5kAqg59e_zUZB00faYz8,453 +requests/compat.py,sha256=FVIeTOniQMHQkeE2JdJvar3OZ-b4IFh8aNezIn45zws,1678 +requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +requests/exceptions.py,sha256=Q8YeWWxiHHXhkEynLpMgC_6_r_ZTYw2aITs9wCSAZNY,3185 +requests/help.py,sha256=lLcBtKAar8T6T78e9Tc4Zfd_EEJFhntxgib1JHNctEI,3515 +requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +requests/models.py,sha256=bce6oORR26SY-dVPaqMpdBunD1zXzrgMSlH6jhfvuRA,34210 +requests/packages.py,sha256=Q2rF0L5mc3wQAvc6q_lAVtPTDOaOeFgD-7kWSQLkjEQ,542 +requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 diff --git a/modules/modules/requests-2.21.0.dist-info/WHEEL b/modules/modules/requests-2.21.0.dist-info/WHEEL new file mode 100644 index 0000000..dea0e20 --- /dev/null +++ b/modules/modules/requests-2.21.0.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/modules/modules/requests-2.21.0.dist-info/top_level.txt b/modules/modules/requests-2.21.0.dist-info/top_level.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/modules/modules/requests-2.21.0.dist-info/top_level.txt @@ -0,0 +1 @@ +requests diff --git a/modules/modules/requests/__init__.py b/modules/modules/requests/__init__.py new file mode 100644 index 0000000..bc168ee --- /dev/null +++ b/modules/modules/requests/__init__.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +try: + from 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 urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/modules/modules/requests/__pycache__/__init__.cpython-36.pyc b/modules/modules/requests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efd9725f3f57e74f47981a37401a82dcee995c87 GIT binary patch literal 3338 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 literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/_internal_utils.cpython-36.pyc b/modules/modules/requests/__pycache__/_internal_utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccecb3603e3c3a393a73ba05a7a1eb5777edc8dc GIT binary patch literal 1282 zcmZ8h!H(ND5G5tq-Y{8X5%knU!D9?GM!N-iFoL3sP0|KvgP^+$6ovtX7RM12iPVzR zZnbcGX!0|?^wht|ALyD>exauhDZ5QWfb?)QoEg6N=&ueB*#+6GzRw7GM?M%S+TY@I zb6g}@5=muJ(K=Zsb-GOJY?)CaZ^=xK-q7Vpj^*SHS&rqw8JV%0KbeKg7MyqUTxkzh ziz;uusvP_6e}l1S)?6tGj)%|6cYM?8!YiX4_oeV$Sl|Wj+8QL^=c+os?)Xo;8tl4M zMad;Jpd~k&!!O=K4H&h7>#&Or@Di#9tmF4wi{Zjy-ntQf#@UW+}~ce zs`5(b&f7i>%SgCFsUpF+FakPZp5lxMd9o#*zE14Xmi(INPkmzfmb^^2^fkpjLpvMn zZGs5Vo44PoE6`kU%&zncZq_fM@Sk%FFNBp9ILFO~`>uiD^Q}cZ1X_&+2il8(5JoVL zBjU8nqcm=TYYe!8eexj<=)%ZQOCU-TcAM)GEW|V#3M?yZH|OW2!g4Nv?)b^s>60hC z)v+mWDuftI*lXor9uLk&JyT9;=Y=l724HMJsvpOa(2rv^2nY{t_6PfB`qZ@k4`T0N z{NKyd#p=Q#MXSeRtyU*Z^H6xP`oR>UTAf4PtQytakApWk>J|JcYQVG;+AJ%8+9k`fGX+jyz=#<*K=zTh)v5ncJpX9kTMV|NL;oU}! l4QdOWMe5?256T68ZLE3lpf<9t;G0{aR=7`=e3G)Ge*neda=-up literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/adapters.cpython-36.pyc b/modules/modules/requests/__pycache__/adapters.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d13b599a9a4a55449f5c7f10cca76a3001a52c47 GIT binary patch literal 16801 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 literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/certs.cpython-36.pyc b/modules/modules/requests/__pycache__/certs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46628727d58f4b4eb9e12dbdcd8f9ffcdc0670ab GIT binary patch literal 595 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 XE+3gI9Q~U0HRJ_{N{^O4Q9ky+WqR%2 literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/exceptions.cpython-36.pyc b/modules/modules/requests/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0459270f1aa21854610fb787a98d6ff90f924725 GIT binary patch literal 5469 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 H0XZU{{e5z1 literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/sessions.cpython-36.pyc b/modules/modules/requests/__pycache__/sessions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7be60aa5d32c0ead48978028efd97f80f5d8636 GIT binary patch literal 19400 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 bJj77s)FH!)0Tt(o^3?QS)b8Wr-^u?2o1%nv literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/status_codes.cpython-36.pyc b/modules/modules/requests/__pycache__/status_codes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab406ad437279eb31a448384d1785d6d70ae7690 GIT binary patch literal 4752 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 T@^pSkU8STJz_GUMJ74}AIIbR} literal 0 HcmV?d00001 diff --git a/modules/modules/requests/__pycache__/utils.cpython-36.pyc b/modules/modules/requests/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d8454f69b6deb67023c971c0361f12dc1cfe31 GIT binary patch literal 22070 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 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) ` 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 ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :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 `. + + :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 `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`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 `. + + :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 `. + + :param request: The :class:`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 `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`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 `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` 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) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/modules/modules/requests/api.py b/modules/modules/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/modules/modules/requests/api.py @@ -0,0 +1,158 @@ +# -*- 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 `. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` 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 ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` 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 ` 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 ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` 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 ` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/modules/modules/requests/auth.py b/modules/modules/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/modules/modules/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 ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/modules/modules/requests/certs.py b/modules/modules/requests/certs.py new file mode 100644 index 0000000..d1a378d --- /dev/null +++ b/modules/modules/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 certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/modules/modules/requests/compat.py b/modules/modules/requests/compat.py new file mode 100644 index 0000000..c44b35e --- /dev/null +++ b/modules/modules/requests/compat.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +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) + +try: + import simplejson as json +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from collections import Callable, Mapping, MutableMapping, OrderedDict + + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/modules/modules/requests/cookies.py b/modules/modules/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/modules/modules/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/modules/modules/requests/exceptions.py b/modules/modules/requests/exceptions.py new file mode 100644 index 0000000..a80cad8 --- /dev/null +++ b/modules/modules/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from 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/modules/modules/requests/help.py b/modules/modules/requests/help.py new file mode 100644 index 0000000..e53d35e --- /dev/null +++ b/modules/modules/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/modules/modules/requests/hooks.py b/modules/modules/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/modules/modules/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 {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/modules/modules/requests/models.py b/modules/modules/requests/models.py new file mode 100644 index 0000000..62dcd0b --- /dev/null +++ b/modules/modules/requests/models.py @@ -0,0 +1,953 @@ +# -*- 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 urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from 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 ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + 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 '' % (self.method) + + def prepare(self): + """Constructs a :class:`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 ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + 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 '' % (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): + 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 ` 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 ` 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 ` 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 ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/modules/modules/requests/packages.py b/modules/modules/requests/packages.py new file mode 100644 index 0000000..7232fe0 --- /dev/null +++ b/modules/modules/requests/packages.py @@ -0,0 +1,14 @@ +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'): + locals()[package] = __import__(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 == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/modules/modules/requests/sessions.py b/modules/modules/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/modules/modules/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://httpbin.org/get') + + """ + + __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 ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`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 `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`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 `, 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 ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`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 `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/modules/modules/requests/status_codes.py b/modules/modules/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/modules/modules/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/modules/modules/requests/structures.py b/modules/modules/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/modules/modules/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 '' % (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/modules/modules/requests/utils.py b/modules/modules/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/modules/modules/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' 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 == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/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/modules/modules/urllib3-1.23.dist-info/DESCRIPTION.rst b/modules/modules/urllib3-1.23.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..5654511 --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/DESCRIPTION.rst @@ -0,0 +1,1040 @@ +urllib3 +======= + +.. image:: https://travis-ci.org/urllib3/urllib3.svg?branch=master + :alt: Build status on Travis + :target: https://travis-ci.org/urllib3/urllib3 + +.. image:: https://img.shields.io/appveyor/ci/urllib3/urllib3/master.svg + :alt: Build status on AppVeyor + :target: https://ci.appveyor.com/project/urllib3/urllib3 + +.. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest + :alt: Documentation Status + :target: https://urllib3.readthedocs.io/en/latest/ + +.. image:: https://img.shields.io/codecov/c/github/urllib3/urllib3.svg + :alt: Coverage Status + :target: https://codecov.io/gh/urllib3/urllib3 + +.. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400 + :alt: PyPI version + :target: https://pypi.org/project/urllib3/ + +.. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525 + :alt: Bountysource + :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE + +.. image:: https://badges.gitter.im/python-urllib3/Lobby.svg + :alt: Gitter + :target: https://gitter.im/python-urllib3/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + +urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip and deflate encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use:: + + >>> import urllib3 + >>> http = urllib3.PoolManager() + >>> r = http.request('GET', 'http://httpbin.org/robots.txt') + >>> r.status + 200 + >>> r.data + 'User-agent: *\nDisallow: /deny\n' + + +Installing +---------- + +urllib3 can be installed with `pip `_:: + + $ pip install urllib3 + +Alternatively, you can grab the latest source code from `GitHub `_:: + + $ git clone git://github.com/urllib3/urllib3.git + $ python setup.py install + + +Documentation +------------- + +urllib3 has usage and reference documentation at `urllib3.readthedocs.io `_. + + +Contributing +------------ + +urllib3 happily accepts contributions. Please see our +`contributing documentation `_ +for some tips on getting started. + + +Maintainers +----------- + +- `@theacodes `_ (Thea Flowers) +- `@SethMichaelLarson `_ (Seth M. Larson) +- `@haikuginger `_ (Jesse Shapiro) +- `@lukasa `_ (Cory Benfield) +- `@sigmavirus24 `_ (Ian Cordasco) +- `@shazow `_ (Andrey Petrov) + +👋 + + +Sponsorship +----------- + +If your company benefits from this library, please consider `sponsoring its +development `_. + +Sponsors include: + +- Google Cloud Platform (2018-present), sponsors `@theacodes `_'s work on an ongoing basis +- Abbott (2018-present), sponsors `@SethMichaelLarson `_'s work on an ongoing basis +- Akamai (2017-present), sponsors `@haikuginger `_'s work on an ongoing basis +- Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s `_ work on urllib3 + + +Changes +======= + +1.23 (2018-06-04) +----------------- + +* Allow providing a list of headers to strip from requests when redirecting + to a different host. Defaults to the ``Authorization`` header. Different + headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316) + +* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247). + +* Dropped Python 3.3 support. (Pull #1242) + +* Put the connection back in the pool when calling stream() or read_chunked() on + a chunked HEAD response. (Issue #1234) + +* Fixed pyOpenSSL-specific ssl client authentication issue when clients + attempted to auth via certificate + chain (Issue #1060) + +* Add the port to the connectionpool connect print (Pull #1251) + +* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380) + +* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088) + +* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359) + +* Added support for auth info in url for SOCKS proxy (Pull #1363) + + +1.22 (2017-07-20) +----------------- + +* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via + IPv6 proxy. (Issue #1222) + +* Made the connection pool retry on ``SSLError``. The original ``SSLError`` + is available on ``MaxRetryError.reason``. (Issue #1112) + +* Drain and release connection before recursing on retry/redirect. Fixes + deadlocks with a blocking connectionpool. (Issue #1167) + +* Fixed compatibility for cookiejar. (Issue #1229) + +* pyopenssl: Use vendored version of ``six``. (Issue #1231) + + +1.21.1 (2017-05-02) +------------------- + +* Fixed SecureTransport issue that would cause long delays in response body + delivery. (Pull #1154) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``socket_options`` flag to the ``PoolManager``. (Issue #1165) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. + (Pull #1157) + + +1.21 (2017-04-25) +----------------- + +* Improved performance of certain selector system calls on Python 3.5 and + later. (Pull #1095) + +* Resolved issue where the PyOpenSSL backend would not wrap SysCallError + exceptions appropriately when sending data. (Pull #1125) + +* Selectors now detects a monkey-patched select module after import for modules + that patch the select module like eventlet, greenlet. (Pull #1128) + +* Reduced memory consumption when streaming zlib-compressed responses + (as opposed to raw deflate streams). (Pull #1129) + +* Connection pools now use the entire request context when constructing the + pool key. (Pull #1016) + +* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, + ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. + (Pull #1016) + +* Add retry counter for ``status_forcelist``. (Issue #1147) + +* Added ``contrib`` module for using SecureTransport on macOS: + ``urllib3.contrib.securetransport``. (Pull #1122) + +* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: + for schemes it does not recognise, it assumes they are case-sensitive and + leaves them unchanged. + (Issue #1080) + + +1.20 (2017-01-19) +----------------- + +* Added support for waiting for I/O using selectors other than select, + improving urllib3's behaviour with large numbers of concurrent connections. + (Pull #1001) + +* Updated the date for the system clock check. (Issue #1005) + +* ConnectionPools now correctly consider hostnames to be case-insensitive. + (Issue #1032) + +* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Pull #1063) + +* Outdated versions of cryptography now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Issue #1044) + +* Automatically attempt to rewind a file-like body object when a request is + retried or redirected. (Pull #1039) + +* Fix some bugs that occur when modules incautiously patch the queue module. + (Pull #1061) + +* Prevent retries from occurring on read timeouts for which the request method + was not in the method whitelist. (Issue #1059) + +* Changed the PyOpenSSL contrib module to lazily load idna to avoid + unnecessarily bloating the memory of programs that don't need it. (Pull + #1076) + +* Add support for IPv6 literals with zone identifiers. (Pull #1013) + +* Added support for socks5h:// and socks4a:// schemes when working with SOCKS + proxies, and controlled remote DNS appropriately. (Issue #1035) + + +1.19.1 (2016-11-16) +------------------- + +* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) + + +1.19 (2016-11-03) +----------------- + +* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when + using the default retry logic. (Pull #955) + +* Remove markers from setup.py to assist ancient setuptools versions. (Issue + #986) + +* Disallow superscripts and other integerish things in URL ports. (Issue #989) + +* Allow urllib3's HTTPResponse.stream() method to continue to work with + non-httplib underlying FPs. (Pull #990) + +* Empty filenames in multipart headers are now emitted as such, rather than + being suppressed. (Issue #1015) + +* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) + + +1.18.1 (2016-10-27) +------------------- + +* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with + PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This + release fixes a vulnerability whereby urllib3 in the above configuration + would silently fail to validate TLS certificates due to erroneously setting + invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous + flags do not cause a problem in OpenSSL versions before 1.1.0, which + interprets the presence of any flag as requesting certificate validation. + + There is no PR for this patch, as it was prepared for simultaneous disclosure + and release. The master branch received the same fix in PR #1010. + + +1.18 (2016-09-26) +----------------- + +* Fixed incorrect message for IncompleteRead exception. (PR #973) + +* Accept ``iPAddress`` subject alternative name fields in TLS certificates. + (Issue #258) + +* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. + (Issue #977) + +* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) + + +1.17 (2016-09-06) +----------------- + +* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) + +* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) + +* Substantially refactored documentation. (Issue #887) + +* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. + (Issue #858) + +* Normalize the scheme and host in the URL parser (Issue #833) + +* ``HTTPResponse`` contains the last ``Retry`` object, which now also + contains retries history. (Issue #848) + +* Timeout can no longer be set as boolean, and must be greater than zero. + (PR #924) + +* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We + now use cryptography and idna, both of which are already dependencies of + PyOpenSSL. (PR #930) + +* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) + +* Try to use the operating system's certificates when we are using an + ``SSLContext``. (PR #941) + +* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to + ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) + +* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) + +* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) + +* Implemented ``length_remaining`` to determine remaining content + to be read. (PR #949) + +* Implemented ``enforce_content_length`` to enable exceptions when + incomplete data chunks are received. (PR #949) + +* Dropped connection start, dropped connection reset, redirect, forced retry, + and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) + + +1.16 (2016-06-11) +----------------- + +* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) + +* Provide ``key_fn_by_scheme`` pool keying mechanism that can be + overridden. (Issue #830) + +* Normalize scheme and host to lowercase for pool keys, and include + ``source_address``. (Issue #830) + +* Cleaner exception chain in Python 3 for ``_make_request``. + (Issue #861) + +* Fixed installing ``urllib3[socks]`` extra. (Issue #864) + +* Fixed signature of ``ConnectionPool.close`` so it can actually safely be + called by subclasses. (Issue #873) + +* Retain ``release_conn`` state across retries. (Issues #651, #866) + +* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to + ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) + + +1.15.1 (2016-04-11) +------------------- + +* Fix packaging to include backports module. (Issue #841) + + +1.15 (2016-04-06) +----------------- + +* Added Retry(raise_on_status=False). (Issue #720) + +* Always use setuptools, no more distutils fallback. (Issue #785) + +* Dropped support for Python 3.2. (Issue #786) + +* Chunked transfer encoding when requesting with ``chunked=True``. + (Issue #790) + +* Fixed regression with IPv6 port parsing. (Issue #801) + +* Append SNIMissingWarning messages to allow users to specify it in + the PYTHONWARNINGS environment variable. (Issue #816) + +* Handle unicode headers in Py2. (Issue #818) + +* Log certificate when there is a hostname mismatch. (Issue #820) + +* Preserve order of request/response headers. (Issue #821) + + +1.14 (2015-12-29) +----------------- + +* contrib: SOCKS proxy support! (Issue #762) + +* Fixed AppEngine handling of transfer-encoding header and bug + in Timeout defaults checking. (Issue #763) + + +1.13.1 (2015-12-18) +------------------- + +* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) + + +1.13 (2015-12-14) +----------------- + +* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) + +* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) + +* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) + +* Close connections more defensively on exception. (Issue #734) + +* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without + repeatedly flushing the decoder, to function better on Jython. (Issue #743) + +* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) + + +1.12 (2015-09-03) +----------------- + +* Rely on ``six`` for importing ``httplib`` to work around + conflicts with other Python 3 shims. (Issue #688) + +* Add support for directories of certificate authorities, as supported by + OpenSSL. (Issue #701) + +* New exception: ``NewConnectionError``, raised when we fail to establish + a new connection, usually ``ECONNREFUSED`` socket error. + + +1.11 (2015-07-21) +----------------- + +* When ``ca_certs`` is given, ``cert_reqs`` defaults to + ``'CERT_REQUIRED'``. (Issue #650) + +* ``pip install urllib3[secure]`` will install Certifi and + PyOpenSSL as dependencies. (Issue #678) + +* Made ``HTTPHeaderDict`` usable as a ``headers`` input value + (Issues #632, #679) + +* Added `urllib3.contrib.appengine `_ + which has an ``AppEngineManager`` for using ``URLFetch`` in a + Google AppEngine environment. (Issue #664) + +* Dev: Added test suite for AppEngine. (Issue #631) + +* Fix performance regression when using PyOpenSSL. (Issue #626) + +* Passing incorrect scheme (e.g. ``foo://``) will raise + ``ValueError`` instead of ``AssertionError`` (backwards + compatible for now, but please migrate). (Issue #640) + +* Fix pools not getting replenished when an error occurs during a + request using ``release_conn=False``. (Issue #644) + +* Fix pool-default headers not applying for url-encoded requests + like GET. (Issue #657) + +* log.warning in Python 3 when headers are skipped due to parsing + errors. (Issue #642) + +* Close and discard connections if an error occurs during read. + (Issue #660) + +* Fix host parsing for IPv6 proxies. (Issue #668) + +* Separate warning type SubjectAltNameWarning, now issued once + per host. (Issue #671) + +* Fix ``httplib.IncompleteRead`` not getting converted to + ``ProtocolError`` when using ``HTTPResponse.stream()`` + (Issue #674) + +1.10.4 (2015-05-03) +------------------- + +* Migrate tests to Tornado 4. (Issue #594) + +* Append default warning configuration rather than overwrite. + (Issue #603) + +* Fix streaming decoding regression. (Issue #595) + +* Fix chunked requests losing state across keep-alive connections. + (Issue #599) + +* Fix hanging when chunked HEAD response has no body. (Issue #605) + + +1.10.3 (2015-04-21) +------------------- + +* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. + (Issue #558) + +* Fix regression of duplicate header keys being discarded. + (Issue #563) + +* ``Response.stream()`` returns a generator for chunked responses. + (Issue #560) + +* Set upper-bound timeout when waiting for a socket in PyOpenSSL. + (Issue #585) + +* Work on platforms without `ssl` module for plain HTTP requests. + (Issue #587) + +* Stop relying on the stdlib's default cipher list. (Issue #588) + + +1.10.2 (2015-02-25) +------------------- + +* Fix file descriptor leakage on retries. (Issue #548) + +* Removed RC4 from default cipher list. (Issue #551) + +* Header performance improvements. (Issue #544) + +* Fix PoolManager not obeying redirect retry settings. (Issue #553) + + +1.10.1 (2015-02-10) +------------------- + +* Pools can be used as context managers. (Issue #545) + +* Don't re-use connections which experienced an SSLError. (Issue #529) + +* Don't fail when gzip decoding an empty stream. (Issue #535) + +* Add sha256 support for fingerprint verification. (Issue #540) + +* Fixed handling of header values containing commas. (Issue #533) + + +1.10 (2014-12-14) +----------------- + +* Disabled SSLv3. (Issue #473) + +* Add ``Url.url`` property to return the composed url string. (Issue #394) + +* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) + +* ``MaxRetryError.reason`` will always be an exception, not string. + (Issue #481) + +* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) + +* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) + +* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. + (Issue #496) + +* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. + (Issue #499) + +* Close and discard sockets which experienced SSL-related errors. + (Issue #501) + +* Handle ``body`` param in ``.request(...)``. (Issue #513) + +* Respect timeout with HTTPS proxy. (Issue #505) + +* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) + + +1.9.1 (2014-09-13) +------------------ + +* Apply socket arguments before binding. (Issue #427) + +* More careful checks if fp-like object is closed. (Issue #435) + +* Fixed packaging issues of some development-related files not + getting included. (Issue #440) + +* Allow performing *only* fingerprint verification. (Issue #444) + +* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) + +* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) + +* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. + (Issue #443) + + + +1.9 (2014-07-04) +---------------- + +* Shuffled around development-related files. If you're maintaining a distro + package of urllib3, you may need to tweak things. (Issue #415) + +* Unverified HTTPS requests will trigger a warning on the first request. See + our new `security documentation + `_ for details. + (Issue #426) + +* New retry logic and ``urllib3.util.retry.Retry`` configuration object. + (Issue #326) + +* All raised exceptions should now wrapped in a + ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) + +* All errors during a retry-enabled request should be wrapped in + ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions + which were previously exempt. Underlying error is accessible from the + ``.reason`` property. (Issue #326) + +* ``urllib3.exceptions.ConnectionError`` renamed to + ``urllib3.exceptions.ProtocolError``. (Issue #326) + +* Errors during response read (such as IncompleteRead) are now wrapped in + ``urllib3.exceptions.ProtocolError``. (Issue #418) + +* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. + (Issue #417) + +* Catch read timeouts over SSL connections as + ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) + +* Apply socket arguments before connecting. (Issue #427) + + +1.8.3 (2014-06-23) +------------------ + +* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) + +* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) + +* Wrap ``socket.timeout`` exception with + ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) + +* Fixed proxy-related bug where connections were being reused incorrectly. + (Issues #366, #369) + +* Added ``socket_options`` keyword parameter which allows to define + ``setsockopt`` configuration of new sockets. (Issue #397) + +* Removed ``HTTPConnection.tcp_nodelay`` in favor of + ``HTTPConnection.default_socket_options``. (Issue #397) + +* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) + + +1.8.2 (2014-04-17) +------------------ + +* Fix ``urllib3.util`` not being included in the package. + + +1.8.1 (2014-04-17) +------------------ + +* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) + +* Don't install ``dummyserver`` into ``site-packages`` as it's only needed + for the test suite. (Issue #362) + +* Added support for specifying ``source_address``. (Issue #352) + + +1.8 (2014-03-04) +---------------- + +* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in + username, and blank ports like 'hostname:'). + +* New ``urllib3.connection`` module which contains all the HTTPConnection + objects. + +* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor + signature to a more sensible order. [Backwards incompatible] + (Issues #252, #262, #263) + +* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) + +* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which + returns the number of bytes read so far. (Issue #277) + +* Support for platforms without threading. (Issue #289) + +* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` + to allow a pool with no specified port to be considered equal to to an + HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) + +* Improved default SSL/TLS settings to avoid vulnerabilities. + (Issue #309) + +* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. + (Issue #310) + +* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests + will send the entire HTTP request ~200 milliseconds faster; however, some of + the resulting TCP packets will be smaller. (Issue #254) + +* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` + from the default 64 to 1024 in a single certificate. (Issue #318) + +* Headers are now passed and stored as a custom + ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. + (Issue #329, #333) + +* Headers no longer lose their case on Python 3. (Issue #236) + +* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA + certificates on inject. (Issue #332) + +* Requests with ``retries=False`` will immediately raise any exceptions without + wrapping them in ``MaxRetryError``. (Issue #348) + +* Fixed open socket leak with SSL-related failures. (Issue #344, #348) + + +1.7.1 (2013-09-25) +------------------ + +* Added granular timeout support with new ``urllib3.util.Timeout`` class. + (Issue #231) + +* Fixed Python 3.4 support. (Issue #238) + + +1.7 (2013-08-14) +---------------- + +* More exceptions are now pickle-able, with tests. (Issue #174) + +* Fixed redirecting with relative URLs in Location header. (Issue #178) + +* Support for relative urls in ``Location: ...`` header. (Issue #179) + +* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus + file-like functionality. (Issue #187) + +* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will + skip hostname verification for SSL connections. (Issue #194) + +* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a + generator wrapped around ``.read(...)``. (Issue #198) + +* IPv6 url parsing enforces brackets around the hostname. (Issue #199) + +* Fixed thread race condition in + ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) + +* ``ProxyManager`` requests now include non-default port in ``Host: ...`` + header. (Issue #217) + +* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) + +* New ``RequestField`` object can be passed to the ``fields=...`` param which + can specify headers. (Issue #220) + +* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. + (Issue #221) + +* Use international headers when posting file names. (Issue #119) + +* Improved IPv6 support. (Issue #203) + + +1.6 (2013-04-25) +---------------- + +* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) + +* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. + +* Improved SSL-related code. ``cert_req`` now optionally takes a string like + "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" + The string values reflect the suffix of the respective constant variable. + (Issue #130) + +* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly + closed proxy connections and larger read buffers. (Issue #135) + +* Ensure the connection is closed if no data is received, fixes connection leak + on some platforms. (Issue #133) + +* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) + +* Tests fixed to be compatible with Py26 again. (Issue #125) + +* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant + to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) + +* Allow an explicit content type to be specified when encoding file fields. + (Issue #126) + +* Exceptions are now pickleable, with tests. (Issue #101) + +* Fixed default headers not getting passed in some cases. (Issue #99) + +* Treat "content-encoding" header value as case-insensitive, per RFC 2616 + Section 3.5. (Issue #110) + +* "Connection Refused" SocketErrors will get retried rather than raised. + (Issue #92) + +* Updated vendored ``six``, no longer overrides the global ``six`` module + namespace. (Issue #113) + +* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding + the exception that prompted the final retry. If ``reason is None`` then it + was due to a redirect. (Issue #92, #114) + +* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. + (Issue #149) + +* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters + that are not files. (Issue #111) + +* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) + +* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or + against an arbitrary hostname (when connecting by IP or for misconfigured + servers). (Issue #140) + +* Streaming decompression support. (Issue #159) + + +1.5 (2012-08-02) +---------------- + +* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug + logging in urllib3. + +* Native full URL parsing (including auth, path, query, fragment) available in + ``urllib3.util.parse_url(url)``. + +* Built-in redirect will switch method to 'GET' if status code is 303. + (Issue #11) + +* ``urllib3.PoolManager`` strips the scheme and host before sending the request + uri. (Issue #8) + +* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, + based on the Content-Type header, fails. + +* Fixed bug with pool depletion and leaking connections (Issue #76). Added + explicit connection closing on pool eviction. Added + ``urllib3.PoolManager.clear()``. + +* 99% -> 100% unit test coverage. + + +1.4 (2012-06-16) +---------------- + +* Minor AppEngine-related fixes. + +* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. + +* Improved url parsing. (Issue #73) + +* IPv6 url support. (Issue #72) + + +1.3 (2012-03-25) +---------------- + +* Removed pre-1.0 deprecated API. + +* Refactored helpers into a ``urllib3.util`` submodule. + +* Fixed multipart encoding to support list-of-tuples for keys with multiple + values. (Issue #48) + +* Fixed multiple Set-Cookie headers in response not getting merged properly in + Python 3. (Issue #53) + +* AppEngine support with Py27. (Issue #61) + +* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs + bytes. + + +1.2.2 (2012-02-06) +------------------ + +* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) + + +1.2.1 (2012-02-05) +------------------ + +* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) + +* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` + which inherits from ``ValueError``. + + +1.2 (2012-01-29) +---------------- + +* Added Python 3 support (tested on 3.2.2) + +* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) + +* Use ``select.poll`` instead of ``select.select`` for platforms that support + it. + +* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive + connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. + +* Fixed ``ImportError`` during install when ``ssl`` module is not available. + (Issue #41) + +* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not + completing properly. (Issue #28, uncovered by Issue #10 in v1.1) + +* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + + ``eventlet``. Removed extraneous unsupported dummyserver testing backends. + Added socket-level tests. + +* More tests. Achievement Unlocked: 99% Coverage. + + +1.1 (2012-01-07) +---------------- + +* Refactored ``dummyserver`` to its own root namespace module (used for + testing). + +* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in + Py32's ``ssl_match_hostname``. (Issue #25) + +* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) + +* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue + #27) + +* Fixed timeout-related bugs. (Issues #17, #23) + + +1.0.2 (2011-11-04) +------------------ + +* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if + you're using the object manually. (Thanks pyos) + +* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by + wrapping the access log in a mutex. (Thanks @christer) + +* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and + ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. + + +1.0.1 (2011-10-10) +------------------ + +* Fixed a bug where the same connection would get returned into the pool twice, + causing extraneous "HttpConnectionPool is full" log warnings. + + +1.0 (2011-10-08) +---------------- + +* Added ``PoolManager`` with LRU expiration of connections (tested and + documented). +* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works + with HTTPS proxies). +* Added optional partial-read support for responses when + ``preload_content=False``. You can now make requests and just read the headers + without loading the content. +* Made response decoding optional (default on, same as before). +* Added optional explicit boundary string for ``encode_multipart_formdata``. +* Convenience request methods are now inherited from ``RequestMethods``. Old + helpers like ``get_url`` and ``post_url`` should be abandoned in favour of + the new ``request(method, url, ...)``. +* Refactored code to be even more decoupled, reusable, and extendable. +* License header added to ``.py`` files. +* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code + and docs in ``docs/`` and on https://urllib3.readthedocs.io/. +* Embettered all the things! +* Started writing this file. + + +0.4.1 (2011-07-17) +------------------ + +* Minor bug fixes, code cleanup. + + +0.4 (2011-03-01) +---------------- + +* Better unicode support. +* Added ``VerifiedHTTPSConnection``. +* Added ``NTLMConnectionPool`` in contrib. +* Minor improvements. + + +0.3.1 (2010-07-13) +------------------ + +* Added ``assert_host_name`` optional parameter. Now compatible with proxies. + + +0.3 (2009-12-10) +---------------- + +* Added HTTPS support. +* Minor bug fixes. +* Refactored, broken backwards compatibility with 0.2. +* API to be treated as stable from this version forward. + + +0.2 (2008-11-17) +---------------- + +* Added unit tests. +* Bug fixes. + + +0.1 (2008-11-16) +---------------- + +* First release. + + diff --git a/modules/modules/urllib3-1.23.dist-info/INSTALLER b/modules/modules/urllib3-1.23.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/urllib3-1.23.dist-info/LICENSE.txt b/modules/modules/urllib3-1.23.dist-info/LICENSE.txt new file mode 100644 index 0000000..1c3283e --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright 2008-2016 Andrey Petrov and contributors (see CONTRIBUTORS.txt) + +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/modules/modules/urllib3-1.23.dist-info/METADATA b/modules/modules/urllib3-1.23.dist-info/METADATA new file mode 100644 index 0000000..a04dd38 --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/METADATA @@ -0,0 +1,1077 @@ +Metadata-Version: 2.0 +Name: urllib3 +Version: 1.23 +Summary: HTTP library with thread-safe connection pooling, file post, and more. +Home-page: https://urllib3.readthedocs.io/ +Author: Andrey Petrov +Author-email: andrey.petrov@shazow.net +License: MIT +Keywords: urllib httplib threadsafe filepost http https ssl pooling +Platform: UNKNOWN +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries +Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4 +Provides-Extra: secure +Provides-Extra: socks +Requires-Dist: pyOpenSSL>=0.14,<18.0.0; python_version=="2.6" and extra == 'secure' +Requires-Dist: pyOpenSSL>=0.14; python_version=="2.7" and extra == 'secure' +Requires-Dist: cryptography>=1.3.4; python_version<="2.7" and extra == 'secure' +Requires-Dist: idna>=2.0.0; python_version<="2.7" and extra == 'secure' +Requires-Dist: certifi; extra == 'secure' +Requires-Dist: ipaddress; python_version<="2.7" and extra == 'secure' +Requires-Dist: PySocks>=1.5.6,<2.0,!=1.5.7; extra == 'socks' + +urllib3 +======= + +.. image:: https://travis-ci.org/urllib3/urllib3.svg?branch=master + :alt: Build status on Travis + :target: https://travis-ci.org/urllib3/urllib3 + +.. image:: https://img.shields.io/appveyor/ci/urllib3/urllib3/master.svg + :alt: Build status on AppVeyor + :target: https://ci.appveyor.com/project/urllib3/urllib3 + +.. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest + :alt: Documentation Status + :target: https://urllib3.readthedocs.io/en/latest/ + +.. image:: https://img.shields.io/codecov/c/github/urllib3/urllib3.svg + :alt: Coverage Status + :target: https://codecov.io/gh/urllib3/urllib3 + +.. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400 + :alt: PyPI version + :target: https://pypi.org/project/urllib3/ + +.. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525 + :alt: Bountysource + :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE + +.. image:: https://badges.gitter.im/python-urllib3/Lobby.svg + :alt: Gitter + :target: https://gitter.im/python-urllib3/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + +urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip and deflate encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use:: + + >>> import urllib3 + >>> http = urllib3.PoolManager() + >>> r = http.request('GET', 'http://httpbin.org/robots.txt') + >>> r.status + 200 + >>> r.data + 'User-agent: *\nDisallow: /deny\n' + + +Installing +---------- + +urllib3 can be installed with `pip `_:: + + $ pip install urllib3 + +Alternatively, you can grab the latest source code from `GitHub `_:: + + $ git clone git://github.com/urllib3/urllib3.git + $ python setup.py install + + +Documentation +------------- + +urllib3 has usage and reference documentation at `urllib3.readthedocs.io `_. + + +Contributing +------------ + +urllib3 happily accepts contributions. Please see our +`contributing documentation `_ +for some tips on getting started. + + +Maintainers +----------- + +- `@theacodes `_ (Thea Flowers) +- `@SethMichaelLarson `_ (Seth M. Larson) +- `@haikuginger `_ (Jesse Shapiro) +- `@lukasa `_ (Cory Benfield) +- `@sigmavirus24 `_ (Ian Cordasco) +- `@shazow `_ (Andrey Petrov) + +👋 + + +Sponsorship +----------- + +If your company benefits from this library, please consider `sponsoring its +development `_. + +Sponsors include: + +- Google Cloud Platform (2018-present), sponsors `@theacodes `_'s work on an ongoing basis +- Abbott (2018-present), sponsors `@SethMichaelLarson `_'s work on an ongoing basis +- Akamai (2017-present), sponsors `@haikuginger `_'s work on an ongoing basis +- Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s `_ work on urllib3 + + +Changes +======= + +1.23 (2018-06-04) +----------------- + +* Allow providing a list of headers to strip from requests when redirecting + to a different host. Defaults to the ``Authorization`` header. Different + headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316) + +* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247). + +* Dropped Python 3.3 support. (Pull #1242) + +* Put the connection back in the pool when calling stream() or read_chunked() on + a chunked HEAD response. (Issue #1234) + +* Fixed pyOpenSSL-specific ssl client authentication issue when clients + attempted to auth via certificate + chain (Issue #1060) + +* Add the port to the connectionpool connect print (Pull #1251) + +* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380) + +* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088) + +* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359) + +* Added support for auth info in url for SOCKS proxy (Pull #1363) + + +1.22 (2017-07-20) +----------------- + +* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via + IPv6 proxy. (Issue #1222) + +* Made the connection pool retry on ``SSLError``. The original ``SSLError`` + is available on ``MaxRetryError.reason``. (Issue #1112) + +* Drain and release connection before recursing on retry/redirect. Fixes + deadlocks with a blocking connectionpool. (Issue #1167) + +* Fixed compatibility for cookiejar. (Issue #1229) + +* pyopenssl: Use vendored version of ``six``. (Issue #1231) + + +1.21.1 (2017-05-02) +------------------- + +* Fixed SecureTransport issue that would cause long delays in response body + delivery. (Pull #1154) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``socket_options`` flag to the ``PoolManager``. (Issue #1165) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. + (Pull #1157) + + +1.21 (2017-04-25) +----------------- + +* Improved performance of certain selector system calls on Python 3.5 and + later. (Pull #1095) + +* Resolved issue where the PyOpenSSL backend would not wrap SysCallError + exceptions appropriately when sending data. (Pull #1125) + +* Selectors now detects a monkey-patched select module after import for modules + that patch the select module like eventlet, greenlet. (Pull #1128) + +* Reduced memory consumption when streaming zlib-compressed responses + (as opposed to raw deflate streams). (Pull #1129) + +* Connection pools now use the entire request context when constructing the + pool key. (Pull #1016) + +* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, + ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. + (Pull #1016) + +* Add retry counter for ``status_forcelist``. (Issue #1147) + +* Added ``contrib`` module for using SecureTransport on macOS: + ``urllib3.contrib.securetransport``. (Pull #1122) + +* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: + for schemes it does not recognise, it assumes they are case-sensitive and + leaves them unchanged. + (Issue #1080) + + +1.20 (2017-01-19) +----------------- + +* Added support for waiting for I/O using selectors other than select, + improving urllib3's behaviour with large numbers of concurrent connections. + (Pull #1001) + +* Updated the date for the system clock check. (Issue #1005) + +* ConnectionPools now correctly consider hostnames to be case-insensitive. + (Issue #1032) + +* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Pull #1063) + +* Outdated versions of cryptography now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Issue #1044) + +* Automatically attempt to rewind a file-like body object when a request is + retried or redirected. (Pull #1039) + +* Fix some bugs that occur when modules incautiously patch the queue module. + (Pull #1061) + +* Prevent retries from occurring on read timeouts for which the request method + was not in the method whitelist. (Issue #1059) + +* Changed the PyOpenSSL contrib module to lazily load idna to avoid + unnecessarily bloating the memory of programs that don't need it. (Pull + #1076) + +* Add support for IPv6 literals with zone identifiers. (Pull #1013) + +* Added support for socks5h:// and socks4a:// schemes when working with SOCKS + proxies, and controlled remote DNS appropriately. (Issue #1035) + + +1.19.1 (2016-11-16) +------------------- + +* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) + + +1.19 (2016-11-03) +----------------- + +* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when + using the default retry logic. (Pull #955) + +* Remove markers from setup.py to assist ancient setuptools versions. (Issue + #986) + +* Disallow superscripts and other integerish things in URL ports. (Issue #989) + +* Allow urllib3's HTTPResponse.stream() method to continue to work with + non-httplib underlying FPs. (Pull #990) + +* Empty filenames in multipart headers are now emitted as such, rather than + being suppressed. (Issue #1015) + +* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) + + +1.18.1 (2016-10-27) +------------------- + +* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with + PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This + release fixes a vulnerability whereby urllib3 in the above configuration + would silently fail to validate TLS certificates due to erroneously setting + invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous + flags do not cause a problem in OpenSSL versions before 1.1.0, which + interprets the presence of any flag as requesting certificate validation. + + There is no PR for this patch, as it was prepared for simultaneous disclosure + and release. The master branch received the same fix in PR #1010. + + +1.18 (2016-09-26) +----------------- + +* Fixed incorrect message for IncompleteRead exception. (PR #973) + +* Accept ``iPAddress`` subject alternative name fields in TLS certificates. + (Issue #258) + +* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. + (Issue #977) + +* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) + + +1.17 (2016-09-06) +----------------- + +* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) + +* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) + +* Substantially refactored documentation. (Issue #887) + +* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. + (Issue #858) + +* Normalize the scheme and host in the URL parser (Issue #833) + +* ``HTTPResponse`` contains the last ``Retry`` object, which now also + contains retries history. (Issue #848) + +* Timeout can no longer be set as boolean, and must be greater than zero. + (PR #924) + +* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We + now use cryptography and idna, both of which are already dependencies of + PyOpenSSL. (PR #930) + +* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) + +* Try to use the operating system's certificates when we are using an + ``SSLContext``. (PR #941) + +* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to + ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) + +* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) + +* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) + +* Implemented ``length_remaining`` to determine remaining content + to be read. (PR #949) + +* Implemented ``enforce_content_length`` to enable exceptions when + incomplete data chunks are received. (PR #949) + +* Dropped connection start, dropped connection reset, redirect, forced retry, + and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) + + +1.16 (2016-06-11) +----------------- + +* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) + +* Provide ``key_fn_by_scheme`` pool keying mechanism that can be + overridden. (Issue #830) + +* Normalize scheme and host to lowercase for pool keys, and include + ``source_address``. (Issue #830) + +* Cleaner exception chain in Python 3 for ``_make_request``. + (Issue #861) + +* Fixed installing ``urllib3[socks]`` extra. (Issue #864) + +* Fixed signature of ``ConnectionPool.close`` so it can actually safely be + called by subclasses. (Issue #873) + +* Retain ``release_conn`` state across retries. (Issues #651, #866) + +* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to + ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) + + +1.15.1 (2016-04-11) +------------------- + +* Fix packaging to include backports module. (Issue #841) + + +1.15 (2016-04-06) +----------------- + +* Added Retry(raise_on_status=False). (Issue #720) + +* Always use setuptools, no more distutils fallback. (Issue #785) + +* Dropped support for Python 3.2. (Issue #786) + +* Chunked transfer encoding when requesting with ``chunked=True``. + (Issue #790) + +* Fixed regression with IPv6 port parsing. (Issue #801) + +* Append SNIMissingWarning messages to allow users to specify it in + the PYTHONWARNINGS environment variable. (Issue #816) + +* Handle unicode headers in Py2. (Issue #818) + +* Log certificate when there is a hostname mismatch. (Issue #820) + +* Preserve order of request/response headers. (Issue #821) + + +1.14 (2015-12-29) +----------------- + +* contrib: SOCKS proxy support! (Issue #762) + +* Fixed AppEngine handling of transfer-encoding header and bug + in Timeout defaults checking. (Issue #763) + + +1.13.1 (2015-12-18) +------------------- + +* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) + + +1.13 (2015-12-14) +----------------- + +* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) + +* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) + +* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) + +* Close connections more defensively on exception. (Issue #734) + +* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without + repeatedly flushing the decoder, to function better on Jython. (Issue #743) + +* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) + + +1.12 (2015-09-03) +----------------- + +* Rely on ``six`` for importing ``httplib`` to work around + conflicts with other Python 3 shims. (Issue #688) + +* Add support for directories of certificate authorities, as supported by + OpenSSL. (Issue #701) + +* New exception: ``NewConnectionError``, raised when we fail to establish + a new connection, usually ``ECONNREFUSED`` socket error. + + +1.11 (2015-07-21) +----------------- + +* When ``ca_certs`` is given, ``cert_reqs`` defaults to + ``'CERT_REQUIRED'``. (Issue #650) + +* ``pip install urllib3[secure]`` will install Certifi and + PyOpenSSL as dependencies. (Issue #678) + +* Made ``HTTPHeaderDict`` usable as a ``headers`` input value + (Issues #632, #679) + +* Added `urllib3.contrib.appengine `_ + which has an ``AppEngineManager`` for using ``URLFetch`` in a + Google AppEngine environment. (Issue #664) + +* Dev: Added test suite for AppEngine. (Issue #631) + +* Fix performance regression when using PyOpenSSL. (Issue #626) + +* Passing incorrect scheme (e.g. ``foo://``) will raise + ``ValueError`` instead of ``AssertionError`` (backwards + compatible for now, but please migrate). (Issue #640) + +* Fix pools not getting replenished when an error occurs during a + request using ``release_conn=False``. (Issue #644) + +* Fix pool-default headers not applying for url-encoded requests + like GET. (Issue #657) + +* log.warning in Python 3 when headers are skipped due to parsing + errors. (Issue #642) + +* Close and discard connections if an error occurs during read. + (Issue #660) + +* Fix host parsing for IPv6 proxies. (Issue #668) + +* Separate warning type SubjectAltNameWarning, now issued once + per host. (Issue #671) + +* Fix ``httplib.IncompleteRead`` not getting converted to + ``ProtocolError`` when using ``HTTPResponse.stream()`` + (Issue #674) + +1.10.4 (2015-05-03) +------------------- + +* Migrate tests to Tornado 4. (Issue #594) + +* Append default warning configuration rather than overwrite. + (Issue #603) + +* Fix streaming decoding regression. (Issue #595) + +* Fix chunked requests losing state across keep-alive connections. + (Issue #599) + +* Fix hanging when chunked HEAD response has no body. (Issue #605) + + +1.10.3 (2015-04-21) +------------------- + +* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. + (Issue #558) + +* Fix regression of duplicate header keys being discarded. + (Issue #563) + +* ``Response.stream()`` returns a generator for chunked responses. + (Issue #560) + +* Set upper-bound timeout when waiting for a socket in PyOpenSSL. + (Issue #585) + +* Work on platforms without `ssl` module for plain HTTP requests. + (Issue #587) + +* Stop relying on the stdlib's default cipher list. (Issue #588) + + +1.10.2 (2015-02-25) +------------------- + +* Fix file descriptor leakage on retries. (Issue #548) + +* Removed RC4 from default cipher list. (Issue #551) + +* Header performance improvements. (Issue #544) + +* Fix PoolManager not obeying redirect retry settings. (Issue #553) + + +1.10.1 (2015-02-10) +------------------- + +* Pools can be used as context managers. (Issue #545) + +* Don't re-use connections which experienced an SSLError. (Issue #529) + +* Don't fail when gzip decoding an empty stream. (Issue #535) + +* Add sha256 support for fingerprint verification. (Issue #540) + +* Fixed handling of header values containing commas. (Issue #533) + + +1.10 (2014-12-14) +----------------- + +* Disabled SSLv3. (Issue #473) + +* Add ``Url.url`` property to return the composed url string. (Issue #394) + +* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) + +* ``MaxRetryError.reason`` will always be an exception, not string. + (Issue #481) + +* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) + +* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) + +* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. + (Issue #496) + +* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. + (Issue #499) + +* Close and discard sockets which experienced SSL-related errors. + (Issue #501) + +* Handle ``body`` param in ``.request(...)``. (Issue #513) + +* Respect timeout with HTTPS proxy. (Issue #505) + +* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) + + +1.9.1 (2014-09-13) +------------------ + +* Apply socket arguments before binding. (Issue #427) + +* More careful checks if fp-like object is closed. (Issue #435) + +* Fixed packaging issues of some development-related files not + getting included. (Issue #440) + +* Allow performing *only* fingerprint verification. (Issue #444) + +* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) + +* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) + +* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. + (Issue #443) + + + +1.9 (2014-07-04) +---------------- + +* Shuffled around development-related files. If you're maintaining a distro + package of urllib3, you may need to tweak things. (Issue #415) + +* Unverified HTTPS requests will trigger a warning on the first request. See + our new `security documentation + `_ for details. + (Issue #426) + +* New retry logic and ``urllib3.util.retry.Retry`` configuration object. + (Issue #326) + +* All raised exceptions should now wrapped in a + ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) + +* All errors during a retry-enabled request should be wrapped in + ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions + which were previously exempt. Underlying error is accessible from the + ``.reason`` property. (Issue #326) + +* ``urllib3.exceptions.ConnectionError`` renamed to + ``urllib3.exceptions.ProtocolError``. (Issue #326) + +* Errors during response read (such as IncompleteRead) are now wrapped in + ``urllib3.exceptions.ProtocolError``. (Issue #418) + +* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. + (Issue #417) + +* Catch read timeouts over SSL connections as + ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) + +* Apply socket arguments before connecting. (Issue #427) + + +1.8.3 (2014-06-23) +------------------ + +* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) + +* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) + +* Wrap ``socket.timeout`` exception with + ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) + +* Fixed proxy-related bug where connections were being reused incorrectly. + (Issues #366, #369) + +* Added ``socket_options`` keyword parameter which allows to define + ``setsockopt`` configuration of new sockets. (Issue #397) + +* Removed ``HTTPConnection.tcp_nodelay`` in favor of + ``HTTPConnection.default_socket_options``. (Issue #397) + +* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) + + +1.8.2 (2014-04-17) +------------------ + +* Fix ``urllib3.util`` not being included in the package. + + +1.8.1 (2014-04-17) +------------------ + +* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) + +* Don't install ``dummyserver`` into ``site-packages`` as it's only needed + for the test suite. (Issue #362) + +* Added support for specifying ``source_address``. (Issue #352) + + +1.8 (2014-03-04) +---------------- + +* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in + username, and blank ports like 'hostname:'). + +* New ``urllib3.connection`` module which contains all the HTTPConnection + objects. + +* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor + signature to a more sensible order. [Backwards incompatible] + (Issues #252, #262, #263) + +* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) + +* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which + returns the number of bytes read so far. (Issue #277) + +* Support for platforms without threading. (Issue #289) + +* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` + to allow a pool with no specified port to be considered equal to to an + HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) + +* Improved default SSL/TLS settings to avoid vulnerabilities. + (Issue #309) + +* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. + (Issue #310) + +* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests + will send the entire HTTP request ~200 milliseconds faster; however, some of + the resulting TCP packets will be smaller. (Issue #254) + +* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` + from the default 64 to 1024 in a single certificate. (Issue #318) + +* Headers are now passed and stored as a custom + ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. + (Issue #329, #333) + +* Headers no longer lose their case on Python 3. (Issue #236) + +* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA + certificates on inject. (Issue #332) + +* Requests with ``retries=False`` will immediately raise any exceptions without + wrapping them in ``MaxRetryError``. (Issue #348) + +* Fixed open socket leak with SSL-related failures. (Issue #344, #348) + + +1.7.1 (2013-09-25) +------------------ + +* Added granular timeout support with new ``urllib3.util.Timeout`` class. + (Issue #231) + +* Fixed Python 3.4 support. (Issue #238) + + +1.7 (2013-08-14) +---------------- + +* More exceptions are now pickle-able, with tests. (Issue #174) + +* Fixed redirecting with relative URLs in Location header. (Issue #178) + +* Support for relative urls in ``Location: ...`` header. (Issue #179) + +* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus + file-like functionality. (Issue #187) + +* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will + skip hostname verification for SSL connections. (Issue #194) + +* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a + generator wrapped around ``.read(...)``. (Issue #198) + +* IPv6 url parsing enforces brackets around the hostname. (Issue #199) + +* Fixed thread race condition in + ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) + +* ``ProxyManager`` requests now include non-default port in ``Host: ...`` + header. (Issue #217) + +* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) + +* New ``RequestField`` object can be passed to the ``fields=...`` param which + can specify headers. (Issue #220) + +* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. + (Issue #221) + +* Use international headers when posting file names. (Issue #119) + +* Improved IPv6 support. (Issue #203) + + +1.6 (2013-04-25) +---------------- + +* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) + +* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. + +* Improved SSL-related code. ``cert_req`` now optionally takes a string like + "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" + The string values reflect the suffix of the respective constant variable. + (Issue #130) + +* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly + closed proxy connections and larger read buffers. (Issue #135) + +* Ensure the connection is closed if no data is received, fixes connection leak + on some platforms. (Issue #133) + +* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) + +* Tests fixed to be compatible with Py26 again. (Issue #125) + +* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant + to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) + +* Allow an explicit content type to be specified when encoding file fields. + (Issue #126) + +* Exceptions are now pickleable, with tests. (Issue #101) + +* Fixed default headers not getting passed in some cases. (Issue #99) + +* Treat "content-encoding" header value as case-insensitive, per RFC 2616 + Section 3.5. (Issue #110) + +* "Connection Refused" SocketErrors will get retried rather than raised. + (Issue #92) + +* Updated vendored ``six``, no longer overrides the global ``six`` module + namespace. (Issue #113) + +* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding + the exception that prompted the final retry. If ``reason is None`` then it + was due to a redirect. (Issue #92, #114) + +* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. + (Issue #149) + +* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters + that are not files. (Issue #111) + +* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) + +* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or + against an arbitrary hostname (when connecting by IP or for misconfigured + servers). (Issue #140) + +* Streaming decompression support. (Issue #159) + + +1.5 (2012-08-02) +---------------- + +* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug + logging in urllib3. + +* Native full URL parsing (including auth, path, query, fragment) available in + ``urllib3.util.parse_url(url)``. + +* Built-in redirect will switch method to 'GET' if status code is 303. + (Issue #11) + +* ``urllib3.PoolManager`` strips the scheme and host before sending the request + uri. (Issue #8) + +* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, + based on the Content-Type header, fails. + +* Fixed bug with pool depletion and leaking connections (Issue #76). Added + explicit connection closing on pool eviction. Added + ``urllib3.PoolManager.clear()``. + +* 99% -> 100% unit test coverage. + + +1.4 (2012-06-16) +---------------- + +* Minor AppEngine-related fixes. + +* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. + +* Improved url parsing. (Issue #73) + +* IPv6 url support. (Issue #72) + + +1.3 (2012-03-25) +---------------- + +* Removed pre-1.0 deprecated API. + +* Refactored helpers into a ``urllib3.util`` submodule. + +* Fixed multipart encoding to support list-of-tuples for keys with multiple + values. (Issue #48) + +* Fixed multiple Set-Cookie headers in response not getting merged properly in + Python 3. (Issue #53) + +* AppEngine support with Py27. (Issue #61) + +* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs + bytes. + + +1.2.2 (2012-02-06) +------------------ + +* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) + + +1.2.1 (2012-02-05) +------------------ + +* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) + +* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` + which inherits from ``ValueError``. + + +1.2 (2012-01-29) +---------------- + +* Added Python 3 support (tested on 3.2.2) + +* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) + +* Use ``select.poll`` instead of ``select.select`` for platforms that support + it. + +* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive + connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. + +* Fixed ``ImportError`` during install when ``ssl`` module is not available. + (Issue #41) + +* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not + completing properly. (Issue #28, uncovered by Issue #10 in v1.1) + +* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + + ``eventlet``. Removed extraneous unsupported dummyserver testing backends. + Added socket-level tests. + +* More tests. Achievement Unlocked: 99% Coverage. + + +1.1 (2012-01-07) +---------------- + +* Refactored ``dummyserver`` to its own root namespace module (used for + testing). + +* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in + Py32's ``ssl_match_hostname``. (Issue #25) + +* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) + +* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue + #27) + +* Fixed timeout-related bugs. (Issues #17, #23) + + +1.0.2 (2011-11-04) +------------------ + +* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if + you're using the object manually. (Thanks pyos) + +* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by + wrapping the access log in a mutex. (Thanks @christer) + +* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and + ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. + + +1.0.1 (2011-10-10) +------------------ + +* Fixed a bug where the same connection would get returned into the pool twice, + causing extraneous "HttpConnectionPool is full" log warnings. + + +1.0 (2011-10-08) +---------------- + +* Added ``PoolManager`` with LRU expiration of connections (tested and + documented). +* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works + with HTTPS proxies). +* Added optional partial-read support for responses when + ``preload_content=False``. You can now make requests and just read the headers + without loading the content. +* Made response decoding optional (default on, same as before). +* Added optional explicit boundary string for ``encode_multipart_formdata``. +* Convenience request methods are now inherited from ``RequestMethods``. Old + helpers like ``get_url`` and ``post_url`` should be abandoned in favour of + the new ``request(method, url, ...)``. +* Refactored code to be even more decoupled, reusable, and extendable. +* License header added to ``.py`` files. +* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code + and docs in ``docs/`` and on https://urllib3.readthedocs.io/. +* Embettered all the things! +* Started writing this file. + + +0.4.1 (2011-07-17) +------------------ + +* Minor bug fixes, code cleanup. + + +0.4 (2011-03-01) +---------------- + +* Better unicode support. +* Added ``VerifiedHTTPSConnection``. +* Added ``NTLMConnectionPool`` in contrib. +* Minor improvements. + + +0.3.1 (2010-07-13) +------------------ + +* Added ``assert_host_name`` optional parameter. Now compatible with proxies. + + +0.3 (2009-12-10) +---------------- + +* Added HTTPS support. +* Minor bug fixes. +* Refactored, broken backwards compatibility with 0.2. +* API to be treated as stable from this version forward. + + +0.2 (2008-11-17) +---------------- + +* Added unit tests. +* Bug fixes. + + +0.1 (2008-11-16) +---------------- + +* First release. + + diff --git a/modules/modules/urllib3-1.23.dist-info/RECORD b/modules/modules/urllib3-1.23.dist-info/RECORD new file mode 100644 index 0000000..b213473 --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/RECORD @@ -0,0 +1,80 @@ +urllib3/__init__.py,sha256=DZucS8tlzGYKmK5FIsyUViMghpCq_0_0Ouvm_Jp9GNc,2853 +urllib3/_collections.py,sha256=iNeAU_we9L3lMGRUKKdq24Mf7o050TXP5U4Jm9AzAY4,10841 +urllib3/connection.py,sha256=My76qeWMDkV-KP1l3iChXHOE7J-ZCaUdP3sPIiLA2uE,14485 +urllib3/connectionpool.py,sha256=w20OwKdIqk6f8FIl6QGgn6jf9gZ0-tmgH7VPxnpEgkQ,35464 +urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +urllib3/poolmanager.py,sha256=FHBjb7odbP2LyQRzeitgpuh1AQAPyegzmrm2b3gSZlY,16821 +urllib3/request.py,sha256=fwjlq5nQfcUa7aoncR25z6-fJAX_oNTcPksKKGjBm38,5996 +urllib3/response.py,sha256=uAuOTZSuTodzvQWIDCZghDoKmZ2bKbgIRCfaVIIZfn8,24667 +urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/appengine.py,sha256=GwC8G9RhBHMsW_szXCUj0Fxg-s58fwaUy1I9QWdsn6o,11173 +urllib3/contrib/ntlmpool.py,sha256=Q9-rO5Rh2-IqyEd4ZicpTDfMnOlf0IPPCkjhChBCjV4,4478 +urllib3/contrib/pyopenssl.py,sha256=NRLCyMHt-POP6ZajpsyH4BrJQy2DaevXWVXZlebcSxE,15463 +urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 +urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/packages/backports/makefile.py,sha256=r1IADol_pBBq2Y1ub4CPyuS2hXuShK47nfFngZRcRhI,1461 +urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +urllib3/packages/ssl_match_hostname/_implementation.py,sha256=lAj7qGCZLOldhn8gZDY6Tqp4mvgkbTfy4k4gDIDRo8g,5702 +urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +urllib3/util/connection.py,sha256=8K1VXm8BHsM3QATJJGBNRa_MStkzDy1Da2IaPAaCU8c,4279 +urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +urllib3/util/response.py,sha256=SSNL888W-MQ8t3HAi44kNGgF682p6H__ytEXzBYxV_M,2343 +urllib3/util/retry.py,sha256=tlxiEq8OU2BSenPpPjYYO1URne8A-qTEgaykam6rZPg,15104 +urllib3/util/ssl_.py,sha256=ZGaPQcKYMqza6vUl54JygUD5XcI0p9dxFwUx8k7sCBw,13993 +urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +urllib3/util/wait.py,sha256=_4vvsT1BTTpqxQYK-2kXVfGsUsVRiuc4R4F-0Bf5BPc,5468 +urllib3-1.23.dist-info/DESCRIPTION.rst,sha256=wO8oxz5hJse8PFH1eQZYnHHZqjsEGFRoHEsfUVbhYJQ,32311 +urllib3-1.23.dist-info/LICENSE.txt,sha256=EdtWlDDKWteT8TmSl7jfUEGiITerr5BkLqcdoh1ZEhw,1175 +urllib3-1.23.dist-info/METADATA,sha256=9Vnr4PogOR0NNBWZRy4LcVITPbFmvbaM-p5jDjKVjLA,34050 +urllib3-1.23.dist-info/RECORD,, +urllib3-1.23.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +urllib3-1.23.dist-info/metadata.json,sha256=84gnKX3kpTNkp5zA5zaidVW3qHwJaE3YFJbbdKCPTNg,1879 +urllib3-1.23.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8 +urllib3-1.23.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc,, +urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc,, +urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc,, +urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +urllib3/contrib/__pycache__/securetransport.cpython-36.pyc,, +urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc,, +urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc,, +urllib3/packages/__pycache__/six.cpython-36.pyc,, +urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +urllib3/util/__pycache__/connection.cpython-36.pyc,, +urllib3/util/__pycache__/queue.cpython-36.pyc,, +urllib3/util/__pycache__/request.cpython-36.pyc,, +urllib3/util/__pycache__/response.cpython-36.pyc,, +urllib3/util/__pycache__/retry.cpython-36.pyc,, +urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +urllib3/util/__pycache__/timeout.cpython-36.pyc,, +urllib3/util/__pycache__/url.cpython-36.pyc,, +urllib3/util/__pycache__/wait.cpython-36.pyc,, +urllib3/util/__pycache__/__init__.cpython-36.pyc,, +urllib3/__pycache__/connection.cpython-36.pyc,, +urllib3/__pycache__/connectionpool.cpython-36.pyc,, +urllib3/__pycache__/exceptions.cpython-36.pyc,, +urllib3/__pycache__/fields.cpython-36.pyc,, +urllib3/__pycache__/filepost.cpython-36.pyc,, +urllib3/__pycache__/poolmanager.cpython-36.pyc,, +urllib3/__pycache__/request.cpython-36.pyc,, +urllib3/__pycache__/response.cpython-36.pyc,, +urllib3/__pycache__/_collections.cpython-36.pyc,, +urllib3/__pycache__/__init__.cpython-36.pyc,, diff --git a/modules/modules/urllib3-1.23.dist-info/WHEEL b/modules/modules/urllib3-1.23.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/urllib3-1.23.dist-info/metadata.json b/modules/modules/urllib3-1.23.dist-info/metadata.json new file mode 100644 index 0000000..5bf347c --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries"], "extensions": {"python.details": {"contacts": [{"email": "andrey.petrov@shazow.net", "name": "Andrey Petrov", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://urllib3.readthedocs.io/"}}}, "extras": ["secure", "socks"], "generator": "bdist_wheel (0.29.0)", "keywords": ["urllib", "httplib", "threadsafe", "filepost", "http", "https", "ssl", "pooling"], "license": "MIT", "metadata_version": "2.0", "name": "urllib3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "run_requires": [{"extra": "socks", "requires": ["PySocks>=1.5.6,<2.0,!=1.5.7"]}, {"extra": "secure", "requires": ["certifi"]}, {"environment": "python_version<=\"2.7\"", "extra": "secure", "requires": ["cryptography>=1.3.4", "idna>=2.0.0", "ipaddress"]}, {"environment": "python_version==\"2.6\"", "extra": "secure", "requires": ["pyOpenSSL>=0.14,<18.0.0"]}, {"environment": "python_version==\"2.7\"", "extra": "secure", "requires": ["pyOpenSSL>=0.14"]}], "summary": "HTTP library with thread-safe connection pooling, file post, and more.", "test_requires": [{"requires": ["mock", "pytest", "tornado"]}], "version": "1.23"} \ No newline at end of file diff --git a/modules/modules/urllib3-1.23.dist-info/top_level.txt b/modules/modules/urllib3-1.23.dist-info/top_level.txt new file mode 100644 index 0000000..a42590b --- /dev/null +++ b/modules/modules/urllib3-1.23.dist-info/top_level.txt @@ -0,0 +1 @@ +urllib3 diff --git a/modules/modules/urllib3-1.24.1.dist-info/INSTALLER b/modules/modules/urllib3-1.24.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/modules/modules/urllib3-1.24.1.dist-info/LICENSE.txt b/modules/modules/urllib3-1.24.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..1c3283e --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright 2008-2016 Andrey Petrov and contributors (see CONTRIBUTORS.txt) + +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/modules/modules/urllib3-1.24.1.dist-info/METADATA b/modules/modules/urllib3-1.24.1.dist-info/METADATA new file mode 100644 index 0000000..611f924 --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/METADATA @@ -0,0 +1,1111 @@ +Metadata-Version: 2.1 +Name: urllib3 +Version: 1.24.1 +Summary: HTTP library with thread-safe connection pooling, file post, and more. +Home-page: https://urllib3.readthedocs.io/ +Author: Andrey Petrov +Author-email: andrey.petrov@shazow.net +License: MIT +Keywords: urllib httplib threadsafe filepost http https ssl pooling +Platform: UNKNOWN +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4 +Provides-Extra: socks +Provides-Extra: secure +Provides-Extra: secure +Requires-Dist: pyOpenSSL (>=0.14); extra == 'secure' +Requires-Dist: cryptography (>=1.3.4); extra == 'secure' +Requires-Dist: idna (>=2.0.0); extra == 'secure' +Requires-Dist: certifi; extra == 'secure' +Requires-Dist: ipaddress; extra == 'secure' +Provides-Extra: socks +Requires-Dist: PySocks (!=1.5.7,<2.0,>=1.5.6); extra == 'socks' + +urllib3 +======= + +.. image:: https://travis-ci.org/urllib3/urllib3.svg?branch=master + :alt: Build status on Travis + :target: https://travis-ci.org/urllib3/urllib3 + +.. image:: https://img.shields.io/appveyor/ci/urllib3/urllib3/master.svg + :alt: Build status on AppVeyor + :target: https://ci.appveyor.com/project/urllib3/urllib3 + +.. image:: https://readthedocs.org/projects/urllib3/badge/?version=latest + :alt: Documentation Status + :target: https://urllib3.readthedocs.io/en/latest/ + +.. image:: https://img.shields.io/codecov/c/github/urllib3/urllib3.svg + :alt: Coverage Status + :target: https://codecov.io/gh/urllib3/urllib3 + +.. image:: https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400 + :alt: PyPI version + :target: https://pypi.org/project/urllib3/ + +.. image:: https://www.bountysource.com/badge/tracker?tracker_id=192525 + :alt: Bountysource + :target: https://www.bountysource.com/trackers/192525-urllib3?utm_source=192525&utm_medium=shield&utm_campaign=TRACKER_BADGE + +.. image:: https://badges.gitter.im/python-urllib3/Lobby.svg + :alt: Gitter + :target: https://gitter.im/python-urllib3/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + +urllib3 is a powerful, *sanity-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip and deflate encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use:: + + >>> import urllib3 + >>> http = urllib3.PoolManager() + >>> r = http.request('GET', 'http://httpbin.org/robots.txt') + >>> r.status + 200 + >>> r.data + 'User-agent: *\nDisallow: /deny\n' + + +Installing +---------- + +urllib3 can be installed with `pip `_:: + + $ pip install urllib3 + +Alternatively, you can grab the latest source code from `GitHub `_:: + + $ git clone git://github.com/urllib3/urllib3.git + $ python setup.py install + + +Documentation +------------- + +urllib3 has usage and reference documentation at `urllib3.readthedocs.io `_. + + +Contributing +------------ + +urllib3 happily accepts contributions. Please see our +`contributing documentation `_ +for some tips on getting started. + + +Maintainers +----------- + +- `@theacodes `_ (Thea Flowers) +- `@SethMichaelLarson `_ (Seth M. Larson) +- `@haikuginger `_ (Jesse Shapiro) +- `@lukasa `_ (Cory Benfield) +- `@sigmavirus24 `_ (Ian Cordasco) +- `@shazow `_ (Andrey Petrov) + +👋 + + +Sponsorship +----------- + +If your company benefits from this library, please consider `sponsoring its +development `_. + +Sponsors include: + +- Google Cloud Platform (2018-present), sponsors `@theacodes `_'s work on an ongoing basis +- Abbott (2018-present), sponsors `@SethMichaelLarson `_'s work on an ongoing basis +- Akamai (2017-present), sponsors `@haikuginger `_'s work on an ongoing basis +- Hewlett Packard Enterprise (2016-2017), sponsored `@Lukasa’s `_ work on urllib3 + + +Changes +======= + +1.24.1 (2018-11-02) +------------------- + +* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467) + +* Restored functionality of `ciphers` parameter for `create_urllib3_context()`. (Issue #1462) + + +1.24 (2018-10-16) +----------------- + +* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449) + +* Test against Python 3.7 on AppVeyor. (Pull #1453) + +* Early-out ipv6 checks when running on App Engine. (Pull #1450) + +* Change ambiguous description of backoff_factor (Pull #1436) + +* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442) + +* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405). + +* Add a server_hostname parameter to HTTPSConnection which allows for + overriding the SNI hostname sent in the handshake. (Pull #1397) + +* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430) + +* Fixed bug where responses with header Content-Type: message/* erroneously + raised HeaderParsingError, resulting in a warning being logged. (Pull #1439) + +* Move urllib3 to src/urllib3 (Pull #1409) + + +1.23 (2018-06-04) +----------------- + +* Allow providing a list of headers to strip from requests when redirecting + to a different host. Defaults to the ``Authorization`` header. Different + headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316) + +* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247). + +* Dropped Python 3.3 support. (Pull #1242) + +* Put the connection back in the pool when calling stream() or read_chunked() on + a chunked HEAD response. (Issue #1234) + +* Fixed pyOpenSSL-specific ssl client authentication issue when clients + attempted to auth via certificate + chain (Issue #1060) + +* Add the port to the connectionpool connect print (Pull #1251) + +* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380) + +* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088) + +* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359) + +* Added support for auth info in url for SOCKS proxy (Pull #1363) + + +1.22 (2017-07-20) +----------------- + +* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via + IPv6 proxy. (Issue #1222) + +* Made the connection pool retry on ``SSLError``. The original ``SSLError`` + is available on ``MaxRetryError.reason``. (Issue #1112) + +* Drain and release connection before recursing on retry/redirect. Fixes + deadlocks with a blocking connectionpool. (Issue #1167) + +* Fixed compatibility for cookiejar. (Issue #1229) + +* pyopenssl: Use vendored version of ``six``. (Issue #1231) + + +1.21.1 (2017-05-02) +------------------- + +* Fixed SecureTransport issue that would cause long delays in response body + delivery. (Pull #1154) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``socket_options`` flag to the ``PoolManager``. (Issue #1165) + +* Fixed regression in 1.21 that threw exceptions when users passed the + ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``. + (Pull #1157) + + +1.21 (2017-04-25) +----------------- + +* Improved performance of certain selector system calls on Python 3.5 and + later. (Pull #1095) + +* Resolved issue where the PyOpenSSL backend would not wrap SysCallError + exceptions appropriately when sending data. (Pull #1125) + +* Selectors now detects a monkey-patched select module after import for modules + that patch the select module like eventlet, greenlet. (Pull #1128) + +* Reduced memory consumption when streaming zlib-compressed responses + (as opposed to raw deflate streams). (Pull #1129) + +* Connection pools now use the entire request context when constructing the + pool key. (Pull #1016) + +* ``PoolManager.connection_from_*`` methods now accept a new keyword argument, + ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``. + (Pull #1016) + +* Add retry counter for ``status_forcelist``. (Issue #1147) + +* Added ``contrib`` module for using SecureTransport on macOS: + ``urllib3.contrib.securetransport``. (Pull #1122) + +* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes: + for schemes it does not recognise, it assumes they are case-sensitive and + leaves them unchanged. + (Issue #1080) + + +1.20 (2017-01-19) +----------------- + +* Added support for waiting for I/O using selectors other than select, + improving urllib3's behaviour with large numbers of concurrent connections. + (Pull #1001) + +* Updated the date for the system clock check. (Issue #1005) + +* ConnectionPools now correctly consider hostnames to be case-insensitive. + (Issue #1032) + +* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Pull #1063) + +* Outdated versions of cryptography now cause the PyOpenSSL contrib module + to fail when it is injected, rather than at first use. (Issue #1044) + +* Automatically attempt to rewind a file-like body object when a request is + retried or redirected. (Pull #1039) + +* Fix some bugs that occur when modules incautiously patch the queue module. + (Pull #1061) + +* Prevent retries from occurring on read timeouts for which the request method + was not in the method whitelist. (Issue #1059) + +* Changed the PyOpenSSL contrib module to lazily load idna to avoid + unnecessarily bloating the memory of programs that don't need it. (Pull + #1076) + +* Add support for IPv6 literals with zone identifiers. (Pull #1013) + +* Added support for socks5h:// and socks4a:// schemes when working with SOCKS + proxies, and controlled remote DNS appropriately. (Issue #1035) + + +1.19.1 (2016-11-16) +------------------- + +* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025) + + +1.19 (2016-11-03) +----------------- + +* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when + using the default retry logic. (Pull #955) + +* Remove markers from setup.py to assist ancient setuptools versions. (Issue + #986) + +* Disallow superscripts and other integerish things in URL ports. (Issue #989) + +* Allow urllib3's HTTPResponse.stream() method to continue to work with + non-httplib underlying FPs. (Pull #990) + +* Empty filenames in multipart headers are now emitted as such, rather than + being suppressed. (Issue #1015) + +* Prefer user-supplied Host headers on chunked uploads. (Issue #1009) + + +1.18.1 (2016-10-27) +------------------- + +* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with + PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This + release fixes a vulnerability whereby urllib3 in the above configuration + would silently fail to validate TLS certificates due to erroneously setting + invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous + flags do not cause a problem in OpenSSL versions before 1.1.0, which + interprets the presence of any flag as requesting certificate validation. + + There is no PR for this patch, as it was prepared for simultaneous disclosure + and release. The master branch received the same fix in PR #1010. + + +1.18 (2016-09-26) +----------------- + +* Fixed incorrect message for IncompleteRead exception. (PR #973) + +* Accept ``iPAddress`` subject alternative name fields in TLS certificates. + (Issue #258) + +* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3. + (Issue #977) + +* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979) + + +1.17 (2016-09-06) +----------------- + +* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835) + +* ConnectionPool debug log now includes scheme, host, and port. (Issue #897) + +* Substantially refactored documentation. (Issue #887) + +* Used URLFetch default timeout on AppEngine, rather than hardcoding our own. + (Issue #858) + +* Normalize the scheme and host in the URL parser (Issue #833) + +* ``HTTPResponse`` contains the last ``Retry`` object, which now also + contains retries history. (Issue #848) + +* Timeout can no longer be set as boolean, and must be greater than zero. + (PR #924) + +* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We + now use cryptography and idna, both of which are already dependencies of + PyOpenSSL. (PR #930) + +* Fixed infinite loop in ``stream`` when amt=None. (Issue #928) + +* Try to use the operating system's certificates when we are using an + ``SSLContext``. (PR #941) + +* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to + ChaCha20, but ChaCha20 is then preferred to everything else. (PR #947) + +* Updated cipher suite list to remove 3DES-based cipher suites. (PR #958) + +* Removed the cipher suite fallback to allow HIGH ciphers. (PR #958) + +* Implemented ``length_remaining`` to determine remaining content + to be read. (PR #949) + +* Implemented ``enforce_content_length`` to enable exceptions when + incomplete data chunks are received. (PR #949) + +* Dropped connection start, dropped connection reset, redirect, forced retry, + and new HTTPS connection log levels to DEBUG, from INFO. (PR #967) + + +1.16 (2016-06-11) +----------------- + +* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840) + +* Provide ``key_fn_by_scheme`` pool keying mechanism that can be + overridden. (Issue #830) + +* Normalize scheme and host to lowercase for pool keys, and include + ``source_address``. (Issue #830) + +* Cleaner exception chain in Python 3 for ``_make_request``. + (Issue #861) + +* Fixed installing ``urllib3[socks]`` extra. (Issue #864) + +* Fixed signature of ``ConnectionPool.close`` so it can actually safely be + called by subclasses. (Issue #873) + +* Retain ``release_conn`` state across retries. (Issues #651, #866) + +* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to + ``HTTPResponse`` but can be replaced with a subclass. (Issue #879) + + +1.15.1 (2016-04-11) +------------------- + +* Fix packaging to include backports module. (Issue #841) + + +1.15 (2016-04-06) +----------------- + +* Added Retry(raise_on_status=False). (Issue #720) + +* Always use setuptools, no more distutils fallback. (Issue #785) + +* Dropped support for Python 3.2. (Issue #786) + +* Chunked transfer encoding when requesting with ``chunked=True``. + (Issue #790) + +* Fixed regression with IPv6 port parsing. (Issue #801) + +* Append SNIMissingWarning messages to allow users to specify it in + the PYTHONWARNINGS environment variable. (Issue #816) + +* Handle unicode headers in Py2. (Issue #818) + +* Log certificate when there is a hostname mismatch. (Issue #820) + +* Preserve order of request/response headers. (Issue #821) + + +1.14 (2015-12-29) +----------------- + +* contrib: SOCKS proxy support! (Issue #762) + +* Fixed AppEngine handling of transfer-encoding header and bug + in Timeout defaults checking. (Issue #763) + + +1.13.1 (2015-12-18) +------------------- + +* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761) + + +1.13 (2015-12-14) +----------------- + +* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706) + +* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717) + +* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696) + +* Close connections more defensively on exception. (Issue #734) + +* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without + repeatedly flushing the decoder, to function better on Jython. (Issue #743) + +* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758) + + +1.12 (2015-09-03) +----------------- + +* Rely on ``six`` for importing ``httplib`` to work around + conflicts with other Python 3 shims. (Issue #688) + +* Add support for directories of certificate authorities, as supported by + OpenSSL. (Issue #701) + +* New exception: ``NewConnectionError``, raised when we fail to establish + a new connection, usually ``ECONNREFUSED`` socket error. + + +1.11 (2015-07-21) +----------------- + +* When ``ca_certs`` is given, ``cert_reqs`` defaults to + ``'CERT_REQUIRED'``. (Issue #650) + +* ``pip install urllib3[secure]`` will install Certifi and + PyOpenSSL as dependencies. (Issue #678) + +* Made ``HTTPHeaderDict`` usable as a ``headers`` input value + (Issues #632, #679) + +* Added `urllib3.contrib.appengine `_ + which has an ``AppEngineManager`` for using ``URLFetch`` in a + Google AppEngine environment. (Issue #664) + +* Dev: Added test suite for AppEngine. (Issue #631) + +* Fix performance regression when using PyOpenSSL. (Issue #626) + +* Passing incorrect scheme (e.g. ``foo://``) will raise + ``ValueError`` instead of ``AssertionError`` (backwards + compatible for now, but please migrate). (Issue #640) + +* Fix pools not getting replenished when an error occurs during a + request using ``release_conn=False``. (Issue #644) + +* Fix pool-default headers not applying for url-encoded requests + like GET. (Issue #657) + +* log.warning in Python 3 when headers are skipped due to parsing + errors. (Issue #642) + +* Close and discard connections if an error occurs during read. + (Issue #660) + +* Fix host parsing for IPv6 proxies. (Issue #668) + +* Separate warning type SubjectAltNameWarning, now issued once + per host. (Issue #671) + +* Fix ``httplib.IncompleteRead`` not getting converted to + ``ProtocolError`` when using ``HTTPResponse.stream()`` + (Issue #674) + +1.10.4 (2015-05-03) +------------------- + +* Migrate tests to Tornado 4. (Issue #594) + +* Append default warning configuration rather than overwrite. + (Issue #603) + +* Fix streaming decoding regression. (Issue #595) + +* Fix chunked requests losing state across keep-alive connections. + (Issue #599) + +* Fix hanging when chunked HEAD response has no body. (Issue #605) + + +1.10.3 (2015-04-21) +------------------- + +* Emit ``InsecurePlatformWarning`` when SSLContext object is missing. + (Issue #558) + +* Fix regression of duplicate header keys being discarded. + (Issue #563) + +* ``Response.stream()`` returns a generator for chunked responses. + (Issue #560) + +* Set upper-bound timeout when waiting for a socket in PyOpenSSL. + (Issue #585) + +* Work on platforms without `ssl` module for plain HTTP requests. + (Issue #587) + +* Stop relying on the stdlib's default cipher list. (Issue #588) + + +1.10.2 (2015-02-25) +------------------- + +* Fix file descriptor leakage on retries. (Issue #548) + +* Removed RC4 from default cipher list. (Issue #551) + +* Header performance improvements. (Issue #544) + +* Fix PoolManager not obeying redirect retry settings. (Issue #553) + + +1.10.1 (2015-02-10) +------------------- + +* Pools can be used as context managers. (Issue #545) + +* Don't re-use connections which experienced an SSLError. (Issue #529) + +* Don't fail when gzip decoding an empty stream. (Issue #535) + +* Add sha256 support for fingerprint verification. (Issue #540) + +* Fixed handling of header values containing commas. (Issue #533) + + +1.10 (2014-12-14) +----------------- + +* Disabled SSLv3. (Issue #473) + +* Add ``Url.url`` property to return the composed url string. (Issue #394) + +* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412) + +* ``MaxRetryError.reason`` will always be an exception, not string. + (Issue #481) + +* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492) + +* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473) + +* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request. + (Issue #496) + +* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``. + (Issue #499) + +* Close and discard sockets which experienced SSL-related errors. + (Issue #501) + +* Handle ``body`` param in ``.request(...)``. (Issue #513) + +* Respect timeout with HTTPS proxy. (Issue #505) + +* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520) + + +1.9.1 (2014-09-13) +------------------ + +* Apply socket arguments before binding. (Issue #427) + +* More careful checks if fp-like object is closed. (Issue #435) + +* Fixed packaging issues of some development-related files not + getting included. (Issue #440) + +* Allow performing *only* fingerprint verification. (Issue #444) + +* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445) + +* Fixed PyOpenSSL compatibility with PyPy. (Issue #450) + +* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3. + (Issue #443) + + + +1.9 (2014-07-04) +---------------- + +* Shuffled around development-related files. If you're maintaining a distro + package of urllib3, you may need to tweak things. (Issue #415) + +* Unverified HTTPS requests will trigger a warning on the first request. See + our new `security documentation + `_ for details. + (Issue #426) + +* New retry logic and ``urllib3.util.retry.Retry`` configuration object. + (Issue #326) + +* All raised exceptions should now wrapped in a + ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326) + +* All errors during a retry-enabled request should be wrapped in + ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions + which were previously exempt. Underlying error is accessible from the + ``.reason`` property. (Issue #326) + +* ``urllib3.exceptions.ConnectionError`` renamed to + ``urllib3.exceptions.ProtocolError``. (Issue #326) + +* Errors during response read (such as IncompleteRead) are now wrapped in + ``urllib3.exceptions.ProtocolError``. (Issue #418) + +* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``. + (Issue #417) + +* Catch read timeouts over SSL connections as + ``urllib3.exceptions.ReadTimeoutError``. (Issue #419) + +* Apply socket arguments before connecting. (Issue #427) + + +1.8.3 (2014-06-23) +------------------ + +* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385) + +* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393) + +* Wrap ``socket.timeout`` exception with + ``urllib3.exceptions.ReadTimeoutError``. (Issue #399) + +* Fixed proxy-related bug where connections were being reused incorrectly. + (Issues #366, #369) + +* Added ``socket_options`` keyword parameter which allows to define + ``setsockopt`` configuration of new sockets. (Issue #397) + +* Removed ``HTTPConnection.tcp_nodelay`` in favor of + ``HTTPConnection.default_socket_options``. (Issue #397) + +* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411) + + +1.8.2 (2014-04-17) +------------------ + +* Fix ``urllib3.util`` not being included in the package. + + +1.8.1 (2014-04-17) +------------------ + +* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356) + +* Don't install ``dummyserver`` into ``site-packages`` as it's only needed + for the test suite. (Issue #362) + +* Added support for specifying ``source_address``. (Issue #352) + + +1.8 (2014-03-04) +---------------- + +* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in + username, and blank ports like 'hostname:'). + +* New ``urllib3.connection`` module which contains all the HTTPConnection + objects. + +* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor + signature to a more sensible order. [Backwards incompatible] + (Issues #252, #262, #263) + +* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274) + +* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which + returns the number of bytes read so far. (Issue #277) + +* Support for platforms without threading. (Issue #289) + +* Expand default-port comparison in ``HTTPConnectionPool.is_same_host`` + to allow a pool with no specified port to be considered equal to to an + HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305) + +* Improved default SSL/TLS settings to avoid vulnerabilities. + (Issue #309) + +* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors. + (Issue #310) + +* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests + will send the entire HTTP request ~200 milliseconds faster; however, some of + the resulting TCP packets will be smaller. (Issue #254) + +* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl`` + from the default 64 to 1024 in a single certificate. (Issue #318) + +* Headers are now passed and stored as a custom + ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``. + (Issue #329, #333) + +* Headers no longer lose their case on Python 3. (Issue #236) + +* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA + certificates on inject. (Issue #332) + +* Requests with ``retries=False`` will immediately raise any exceptions without + wrapping them in ``MaxRetryError``. (Issue #348) + +* Fixed open socket leak with SSL-related failures. (Issue #344, #348) + + +1.7.1 (2013-09-25) +------------------ + +* Added granular timeout support with new ``urllib3.util.Timeout`` class. + (Issue #231) + +* Fixed Python 3.4 support. (Issue #238) + + +1.7 (2013-08-14) +---------------- + +* More exceptions are now pickle-able, with tests. (Issue #174) + +* Fixed redirecting with relative URLs in Location header. (Issue #178) + +* Support for relative urls in ``Location: ...`` header. (Issue #179) + +* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus + file-like functionality. (Issue #187) + +* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will + skip hostname verification for SSL connections. (Issue #194) + +* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a + generator wrapped around ``.read(...)``. (Issue #198) + +* IPv6 url parsing enforces brackets around the hostname. (Issue #199) + +* Fixed thread race condition in + ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204) + +* ``ProxyManager`` requests now include non-default port in ``Host: ...`` + header. (Issue #217) + +* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139) + +* New ``RequestField`` object can be passed to the ``fields=...`` param which + can specify headers. (Issue #220) + +* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails. + (Issue #221) + +* Use international headers when posting file names. (Issue #119) + +* Improved IPv6 support. (Issue #203) + + +1.6 (2013-04-25) +---------------- + +* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156) + +* ``ProxyManager`` automatically adds ``Host: ...`` header if not given. + +* Improved SSL-related code. ``cert_req`` now optionally takes a string like + "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23" + The string values reflect the suffix of the respective constant variable. + (Issue #130) + +* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly + closed proxy connections and larger read buffers. (Issue #135) + +* Ensure the connection is closed if no data is received, fixes connection leak + on some platforms. (Issue #133) + +* Added SNI support for SSL/TLS connections on Py32+. (Issue #89) + +* Tests fixed to be compatible with Py26 again. (Issue #125) + +* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant + to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109) + +* Allow an explicit content type to be specified when encoding file fields. + (Issue #126) + +* Exceptions are now pickleable, with tests. (Issue #101) + +* Fixed default headers not getting passed in some cases. (Issue #99) + +* Treat "content-encoding" header value as case-insensitive, per RFC 2616 + Section 3.5. (Issue #110) + +* "Connection Refused" SocketErrors will get retried rather than raised. + (Issue #92) + +* Updated vendored ``six``, no longer overrides the global ``six`` module + namespace. (Issue #113) + +* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding + the exception that prompted the final retry. If ``reason is None`` then it + was due to a redirect. (Issue #92, #114) + +* Fixed ``PoolManager.urlopen()`` from not redirecting more than once. + (Issue #149) + +* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters + that are not files. (Issue #111) + +* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122) + +* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or + against an arbitrary hostname (when connecting by IP or for misconfigured + servers). (Issue #140) + +* Streaming decompression support. (Issue #159) + + +1.5 (2012-08-02) +---------------- + +* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug + logging in urllib3. + +* Native full URL parsing (including auth, path, query, fragment) available in + ``urllib3.util.parse_url(url)``. + +* Built-in redirect will switch method to 'GET' if status code is 303. + (Issue #11) + +* ``urllib3.PoolManager`` strips the scheme and host before sending the request + uri. (Issue #8) + +* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding, + based on the Content-Type header, fails. + +* Fixed bug with pool depletion and leaking connections (Issue #76). Added + explicit connection closing on pool eviction. Added + ``urllib3.PoolManager.clear()``. + +* 99% -> 100% unit test coverage. + + +1.4 (2012-06-16) +---------------- + +* Minor AppEngine-related fixes. + +* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``. + +* Improved url parsing. (Issue #73) + +* IPv6 url support. (Issue #72) + + +1.3 (2012-03-25) +---------------- + +* Removed pre-1.0 deprecated API. + +* Refactored helpers into a ``urllib3.util`` submodule. + +* Fixed multipart encoding to support list-of-tuples for keys with multiple + values. (Issue #48) + +* Fixed multiple Set-Cookie headers in response not getting merged properly in + Python 3. (Issue #53) + +* AppEngine support with Py27. (Issue #61) + +* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs + bytes. + + +1.2.2 (2012-02-06) +------------------ + +* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47) + + +1.2.1 (2012-02-05) +------------------ + +* Fixed another bug related to when ``ssl`` module is not available. (Issue #41) + +* Location parsing errors now raise ``urllib3.exceptions.LocationParseError`` + which inherits from ``ValueError``. + + +1.2 (2012-01-29) +---------------- + +* Added Python 3 support (tested on 3.2.2) + +* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2) + +* Use ``select.poll`` instead of ``select.select`` for platforms that support + it. + +* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive + connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``. + +* Fixed ``ImportError`` during install when ``ssl`` module is not available. + (Issue #41) + +* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not + completing properly. (Issue #28, uncovered by Issue #10 in v1.1) + +* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` + + ``eventlet``. Removed extraneous unsupported dummyserver testing backends. + Added socket-level tests. + +* More tests. Achievement Unlocked: 99% Coverage. + + +1.1 (2012-01-07) +---------------- + +* Refactored ``dummyserver`` to its own root namespace module (used for + testing). + +* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in + Py32's ``ssl_match_hostname``. (Issue #25) + +* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10) + +* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue + #27) + +* Fixed timeout-related bugs. (Issues #17, #23) + + +1.0.2 (2011-11-04) +------------------ + +* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if + you're using the object manually. (Thanks pyos) + +* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by + wrapping the access log in a mutex. (Thanks @christer) + +* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and + ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code. + + +1.0.1 (2011-10-10) +------------------ + +* Fixed a bug where the same connection would get returned into the pool twice, + causing extraneous "HttpConnectionPool is full" log warnings. + + +1.0 (2011-10-08) +---------------- + +* Added ``PoolManager`` with LRU expiration of connections (tested and + documented). +* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works + with HTTPS proxies). +* Added optional partial-read support for responses when + ``preload_content=False``. You can now make requests and just read the headers + without loading the content. +* Made response decoding optional (default on, same as before). +* Added optional explicit boundary string for ``encode_multipart_formdata``. +* Convenience request methods are now inherited from ``RequestMethods``. Old + helpers like ``get_url`` and ``post_url`` should be abandoned in favour of + the new ``request(method, url, ...)``. +* Refactored code to be even more decoupled, reusable, and extendable. +* License header added to ``.py`` files. +* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code + and docs in ``docs/`` and on https://urllib3.readthedocs.io/. +* Embettered all the things! +* Started writing this file. + + +0.4.1 (2011-07-17) +------------------ + +* Minor bug fixes, code cleanup. + + +0.4 (2011-03-01) +---------------- + +* Better unicode support. +* Added ``VerifiedHTTPSConnection``. +* Added ``NTLMConnectionPool`` in contrib. +* Minor improvements. + + +0.3.1 (2010-07-13) +------------------ + +* Added ``assert_host_name`` optional parameter. Now compatible with proxies. + + +0.3 (2009-12-10) +---------------- + +* Added HTTPS support. +* Minor bug fixes. +* Refactored, broken backwards compatibility with 0.2. +* API to be treated as stable from this version forward. + + +0.2 (2008-11-17) +---------------- + +* Added unit tests. +* Bug fixes. + + +0.1 (2008-11-16) +---------------- + +* First release. + + diff --git a/modules/modules/urllib3-1.24.1.dist-info/RECORD b/modules/modules/urllib3-1.24.1.dist-info/RECORD new file mode 100644 index 0000000..b01baac --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/RECORD @@ -0,0 +1,78 @@ +urllib3-1.24.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +urllib3-1.24.1.dist-info/LICENSE.txt,sha256=EdtWlDDKWteT8TmSl7jfUEGiITerr5BkLqcdoh1ZEhw,1175 +urllib3-1.24.1.dist-info/METADATA,sha256=c002jxlavxdx81cJ8FUj73U9H2rssjGr4cGGnx12D7o,34997 +urllib3-1.24.1.dist-info/RECORD,, +urllib3-1.24.1.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +urllib3-1.24.1.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8 +urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722 +urllib3/__pycache__/__init__.cpython-36.pyc,, +urllib3/__pycache__/_collections.cpython-36.pyc,, +urllib3/__pycache__/connection.cpython-36.pyc,, +urllib3/__pycache__/connectionpool.cpython-36.pyc,, +urllib3/__pycache__/exceptions.cpython-36.pyc,, +urllib3/__pycache__/fields.cpython-36.pyc,, +urllib3/__pycache__/filepost.cpython-36.pyc,, +urllib3/__pycache__/poolmanager.cpython-36.pyc,, +urllib3/__pycache__/request.cpython-36.pyc,, +urllib3/__pycache__/response.cpython-36.pyc,, +urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746 +urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839 +urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097 +urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc,, +urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +urllib3/contrib/__pycache__/securetransport.cpython-36.pyc,, +urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717 +urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc,, +urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc,, +urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc,, +urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +urllib3/contrib/appengine.py,sha256=lB2Fame05OAlaSJs1a86QYF84v7Oymbqjs0OIcexq_s,10914 +urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459 +urllib3/contrib/pyopenssl.py,sha256=bacOUEcrs3o9JTfhe2FCYAIiL36ZezL3N6Ey7Fi_65w,15806 +urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/__pycache__/six.cpython-36.pyc,, +urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc,, +urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456 +urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +urllib3/packages/ssl_match_hostname/_implementation.py,sha256=_foKOc3Los_n21TCW4IpjTTRHppsjw35vnu7dRBv-88,5683 +urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853 +urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991 +urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609 +urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +urllib3/util/__pycache__/__init__.cpython-36.pyc,, +urllib3/util/__pycache__/connection.cpython-36.pyc,, +urllib3/util/__pycache__/queue.cpython-36.pyc,, +urllib3/util/__pycache__/request.cpython-36.pyc,, +urllib3/util/__pycache__/response.cpython-36.pyc,, +urllib3/util/__pycache__/retry.cpython-36.pyc,, +urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +urllib3/util/__pycache__/timeout.cpython-36.pyc,, +urllib3/util/__pycache__/url.cpython-36.pyc,, +urllib3/util/__pycache__/wait.cpython-36.pyc,, +urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639 +urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586 +urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105 +urllib3/util/ssl_.py,sha256=-JmYnEO09O4AjuQ5N-k_1Mh74ZbAJo1LXV-6Nzu-eIc,13143 +urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403 diff --git a/modules/modules/urllib3-1.24.1.dist-info/WHEEL b/modules/modules/urllib3-1.24.1.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/modules/modules/urllib3-1.24.1.dist-info/top_level.txt b/modules/modules/urllib3-1.24.1.dist-info/top_level.txt new file mode 100644 index 0000000..a42590b --- /dev/null +++ b/modules/modules/urllib3-1.24.1.dist-info/top_level.txt @@ -0,0 +1 @@ +urllib3 diff --git a/modules/modules/urllib3/__init__.py b/modules/modules/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/modules/modules/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/modules/modules/urllib3/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..020f949526e6c641d0b36e690cf3d037282d1b8c GIT binary patch literal 2174 zcma)7S#R4$5aywSq7L72ZTDafCsrE^$nj7FK@m4;ngEI6#!6dk1rTfPN}{q$(!0wf z5}YR&ee0j-TmKSY`;@=Xr_L@V$4wfbBsiQI?##~4d^5b&Z2CW1gWey$W&LHHyIR2C zgGb)BEsI#lA~tcD%^l>}ns=FtTv8%sR^nw;<`q=oRaAvucLLtH`ynA18o4WW7tHS z@NTh9zJ<0xw}3t+i|8}5ggz%%(HC@c9MFrW_V^OrI<-!1+XBtyflUIk@vDul{IW&e z@iw_gYvZfr61n`l3oEqd3TUo~MG#$STpZL$S^zas9T)xI|U+Rp@I(b277 zH|UN8#bj6F0S)>|9Misvk~m0{ghlZ%z%dB~-OVHj9sjK^MBC06@R3Ydrf3-PG!bh5 zEfm9QyZQ2?Zuj8+nVSRflCNmp;rq&WdxZm$@DL&b$3A`Cr>TxWg0w;7enM!-Gp3>x z3l$C$!3kCvwyJCAPjQTgROF2Vk-VPFrBB!f{g-PwzYpp)PLJ|-`N9Z-YVNsV|j z)rqNU=kC+T-D%}U=jQFs4N-y=iLxd&O#s-IXlSyi$pVmk2@?`Z1wo0BB||uwsA&Bn zi6lN^G<=0c43&_=(>A&nL{pPGkiM>gzTDY!AKvmI5M_;R<(%4YY~b8e>y2~bj7z|m ziG2#UZJpTT$_cD6T=m325_BGMzz!Pg!~x*A)8G66u1A!mR0L3q;5du=FW4l2xD8r@ zLj`c+vrGjl3Dk%N#ZfxJb4dpo(}ux!f?@7|ftkj8L_uEeH z%|AhcVYo0lh!`Xo;`91g(P1JcCQ${s1ks39AV0$+9UxYz-TEJ`W|Cr>%b5RHKeeyt z)i5MUA8PN1;UEKa0uF@UMO*`tx84mgJulB~Yr57FRlUlC6VMc9i`gWv>!rMyTjwT$ z?%>=Lvk_$m18QU{VjV$`GYZza(UE6VkVez|vlY4#U|^XUg8Z2g46b6btbv_a((d6D zI8&oUz=`T%$f7=laaag10dg>QL4ZR8wBVo@wBfoYTiUw(;Ja_1e_teSM=KT%X+IN@ zn*3BurF`u$I~v0eWRIzR=$W~C{W0tUE9n8l3YwqKKP(;YKYkiX{coA8>UvPmgrYLK zE8eSk?%m}H$r$}c!&2@8DLD<>b5<)20QD+7v%BQk4X0$o?OOK7?vlIgwpN_#va{?! Ib2!WHKk`gf-T(jq literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/_collections.cpython-36.pyc b/modules/modules/urllib3/__pycache__/_collections.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84e83b1e8daf4ffb098fe026035885abf33eddaf GIT binary patch literal 10661 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 H|H=OW9R&#*tofRy@m;rc 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 literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/exceptions.cpython-36.pyc b/modules/modules/urllib3/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..233185da11e0b261a931bf4dd3c93f808d723ee2 GIT binary patch literal 10373 zcmbtaO>7*;m7ZU6NRbppn)?J^uOD?(OwAf270dfp5mmGEv>%(F%d)m`}?^SnCH$}y6 zc%*L5d;L@Iuio!mnVz2fS!wghpHG!a|53_(>iB*Whj~ybm1Iel{ZhBQUM`npMOOVv zx4K>{mp(1Ynyi0al66)8s=7V~cubB19#`Xl8-N>f0`PGin}B)Ye}C=5_f7FmI@Nym0}rkY@p(RSTfI zwtgI#H|05C&M_Y+0KX*{0WUIq67bvd9l-A>TD7+RDlq3|6PTuY74JL^_($?x!0$2@ zuK~UwF9N=(8n}K2a7$hSd`X=F{5s(G6El1n?(nOx18l6_}gy z7BIK?j<*5dmdk*b75Ky*=YhE+SAbdJJDPy+%1;4*%J7fmy|q&F{u88Sivt=yp24E$K-t%%}fbTV8td*eGqD+;uj*C%1aNJ5J<0c@Vme|KySC z_MY^--bF7kk>mRp)fbohU%c-GPx{*Ty^SmB-;_er>g{RTcMW2&MqkRcGGhwK;0Vd! z9~>Qc!Pej`OJUbSFOz{DBc{gbL~H8_I;D)-Z$}6>h0`>S5p{&gQ3rQnH6-vQuOV6e zy0l)iE@Qne$DpzC;l#r*^sUA&9njcjsD&b38sR#uzFiO63xp$jc&O!8u>^hSF9~iL zhj|^R{qlaPQ;N!;SN7q$097_C$4g&T;J!*&wbCApEt(~5|BjbdQOC$ z`*`(%X}K(EP(gp`U}2IV_Mz!S(R-4>iw`9{3w8<2VRBPehY|*)0;L5XqAdb@+VG5`7^{bhNE9WQiyg@Go?)CBG1z zCqUK39G!$IMCXw^$_=HmgkH-M>hzqMR_B;5k{E;bP3q(F3A4uePq(Zxr5y;$sp z=%y|7evWR!6ry_?@{K|_appI&l$)@t$a8OrexRQBU;vyqKjZlXk46 zIg(b62?P6NKafiMd-OI%LD=%sPF*ks+%)LE4Pd`YE*RmqvJYo>y!2(w24D)m`^X?i z!S_ALIF%U@LIM*M+%4gYMx0-^5g!TLqHe;4k6GF@xhm_$>j%B~X}a_>SN;GO4P`e7 z)RjtkvNAZH({$?3oAA-~Lv4@a=3(B6jOsSMpS@F~R?&p{o(4FU8ep9hqS}5*!Yt9Ek#uE%EjVLNqlr zN+vpdKiowMQpBd-0>NMASRhOx7LG3aA=1&8@(|}D0(mOBCL(6a*#v}|&n7^~3XRxM zh%hd{tPl^2p!gR#9tcy2hdFBBP zk7^Yzzt@in(N9^_H#zzVlcT=^#7(+|^7C9Gi@vOFuON%44^uuKI@-j1e4OP2X+wvy z1A%Utru>(a4t7&__5fLJaC>s#okM^gJ03gRK8MnFjX0xPLwucHj^I|Oy=If zYkx@#q=^Axa!N>p#EVKm9Z^MZtHw&0UX9BcyQS}-TPV@f5Dx9$$ngRgKId!5=_tiU zfS~+an0~M4Q?|vuu6&w0I2nc5>Q1niK4VKJGk80_^3RlJ^i78f$uAGy_mZ~IaQf4g z_R8x0<<83L>Q7gPGiwi5mhaz9;7ogDRF*d(nO~EvNEuX?Bcu}UaB01yXM1!_A-(XT zy`*RP9(@7#+*0T%4H0!IXqxywhzT7qPOP|-V2b#;3n1@bh~!wkWlfku1TU=hH$F!V zd&`g7=o}|x-_DYqxaTB3@>YvoM7BfH_2Lv!tlerCau(EP_}3gGgekAme3R*i*jcw+{4!scBEfD#e9NB~^ME0?@Jrk)e<%kKzIg>Gb znR8fn)O{0o9N^hDlwfyV#AGgkz~ALaCQKocPb89l=sOYFb3*t^R@7t|@Cvq#76zN% zR$p^4A~u3B63!0%DAE{3Eg!_s_+^C@@E&OYeU2N#6yoOCTKoQI)^HO(u4eg2OeSw8 z93d%t!P6s73ekQUl>Q+{J7J2^en+8xl`3#kf8%l?k!1h{n-jsrdJ##!>qsuy?3fC2 zw^Je;@skZ4@|4N3JrOLGKCs(e@wZo!KV_Y5SMdF-5N)E0iIOM-d zqRq~`!L?T@)Px!xA3`GxA@;!BFnFQMrjU}ZfY^Ue$)}J&m_p>AydBCtkbW;Qg27THo;F%hB5`l{0pDf&cnD$KXrxkt z#D}qyhrGO%pS^NzN5urpBNFIf^c62mNy}4Ya*^lwPx+>u5X}u2V&ldXlF2RjD2|e- zSdh^~xYSiL7P=$jZQ&+TpufpssJ9K(W0w-AFodPn2CsZ&O*!l1&2-O#%txNDvQ|#F8!qGFG(Y7x$zKw`o3*;-2?AR z56)8`dYiw~TxG}OW-ojTRZ!b(TihEf@8d@CA!R;`+wo? z*nk@4!RZ&-OpX5U4UDhS!iQT8(e$6mA}9l@Oyv(#hBY24=#YKd`l%h)ub2s-v5H)& zW38%#ZBKVy5b*8-Js%|B$W#%#p&^>)`QcV;H~t9(H(QdiBMo(H|O}&LLq^Vv* zR_xCPzN}_^Q8m?AwLMr^G#4<@qUE75>gl1d)x+`FdY~az*~fULRhb<;567k2MEzif z)5*gfdid|C@PF`%ScT|@pMFs|KU9T8<9{cM@PL&tITe1_wqJN0XtnDFk`h#k&{k_# z<3SeMK5p2j)(>PwQw*+nxyHk^jY{b*#;#51qQ^oK<)qL=qF6O`7ZrpVzZAZ zk6%n^YGJIu-gDe%*w3bAyyvZMxPxz*5Xk;+cs$N2I(f%FoJfad_9r9baRSUgjj=y5 z;0YClFnxkf)FaR|kQ^RGAdcsDEE=8?@z{a8_}q-vXX*Ag>2!`xWR9A;Si{LtM@my$ zNK;#at8K1eHC2C_YAJn*PL$MZ%8ogC-cvB|LAXhcC1#Pou8e+w~4v&+4>w~ah{yDciOw^vkl-H MbF;W(Vs`xh0Z}jcDgXcg literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/fields.cpython-36.pyc b/modules/modules/urllib3/__pycache__/fields.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d0d11383ebc58557043bd92488382f677d16cdd GIT binary patch literal 5843 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 O0x{H$mf4)Ezx{uW#xY$0 literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/filepost.cpython-36.pyc b/modules/modules/urllib3/__pycache__/filepost.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12ee4e727fc07218508526c45a2233ce70fc5d9b GIT binary patch literal 2733 zcmbtWTW=dh6rLHcH=B)fsapy~P==~S7{!KC2_aL;r7cnghiwh$MQIcoMti#yc*SkjQwY!J3np4x!4h+*Fh{pGFyO7#^6UkWY)eAFf ze|m^_3~@tza1jpNgr+ZpFl0;(8`lIqfZskb&bY4lgp6Imusiaa(R*Ew(=n(te@hI2vA? zy+=_j^GusgzFRJzGJYA((H;omtWcNwRGkAoL{RZTU>#_Pwq6He06s$xm^zOTPY3`? zQ_nb+w)4S+-Xf1L?K7CiOdaNRC+s2kX#29MkKGCTja0oy5Sicxw)cxgZ_P**7|FAz zQt=V`T6cW=<$jT4oM;|L+VE_|-``s0Pg~p+;3UlfO)jF)=vAxYBn`9d(ry@oQ@a~K zPXXynH$E9s8`ERf!DoI15dc`Gp)4KTwDQt?1ja#2bm^d~<^YFsVWhHTP+8Hcm2S0n zNu#oERqMe@oW=P~Tsp9y2H9{d!Q=}F>JkXz`Lw}2<^%p7Q*Xn_%mXil_bPmudEla; zf;}fkez*m`xDUCEV-r&KT29c04J;a+4i_?4G6bAOx67|~KB*91`&aBAY)T#o5t%4U z5&BmGlqbO!IL2&7nvaS!#KqQt3^QLE+2Lz|vJAv3FSO)coYdX;J3Je!{Mlv{ZbBxS zLZ$lEeafc*|Hlxj5_yI^#y&QU?M)C9^0?V&`*fd8=!A``xCTCjIHv2?)es1*^HE8+ zO8WFv0KAyL{zRs7Cs#MRxFG}KkiCn?_tu^3F=n>D(V0#Cf5xbbaEN*b1xJCTavYNC zUFcqiHnpYYsMm19c@)S`>U9t;s_^co)|Lw=>~6z%?Sdc;pPpmt5@;db4<8)I&2B=| ze}FLLfFOc`Zh7h)a0%I`I}^i@L4Z5*{n`YW#W(`yoQJUks9mN$0qO?6sg2zO7^4KV zxqZiY6UWR0%lu^gi340zjVz2CFt#^a1z#vhecTsk!D=iIHPp5*KC(SH&pC0PFX~lq zA5I=G9*{|Wgmugf?j7aR?G$O72bO*y#-S2mj%;jHOt7&5(G3L!5<&8$h)t9S%6tfw zBxws^aeim*&TT9#NnoaN+JzZGGNr$+4R;RDEnuSK{j1$M6r^K9l)J01mYc1YPdchM z$7ijLc$yima~Vc(5~L`YpTZ@pvc->9@MlpR^P%Jz)5zSSy6w#9X;vRI@3aJ+DnCHK zc*XTSx81&?7kwLwi~gR6-F6$af5PswnH`^B(XAzgS!(N+rOvYc4Cz{7oqJZZ1pji8N1xxR5QkN`f=Er8CULu6hg4 zd=LALFiQ>mOR#HB=g9?W!(=dvfC0K35B~zzY7T-dxYVOATcS~WA+bVK}f1i$lw25p_KXEI|A-1A<*ON>XvAlsLO1}Z30r!9(*xaD-V@oy9 J_s)6EzW{@RzSIB! literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/poolmanager.cpython-36.pyc b/modules/modules/urllib3/__pycache__/poolmanager.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02152bbb41b42e9bbfedc49152dd5c0d81b11b11 GIT binary patch literal 12940 zcmbtaOKcohcCD(e{_-n|qU6uW<*!UfqHM|I%n-6*MY6^-wmFI^EtoNb^Pc2(}&jh&U@nvtNFZN^Xqc=!gmbs zf;ama>h_loOU)PYe9@c3^PK-8o?r6b^yX35%bs=1SpC&6IaRA>y5MfcQ8-NeR?r(n zD%toF)5Q-bZu%X+pM?7##lCkn>L+f{_tmPEF1>gA_6@w~`<*0+`ZuB|Opo*3t)nkd z$2@CnZSJ??&W_*nS4-*A2T{jmv5(zw=)bE}q|&($-MyQBqW1OU(hU{u?cb6TAN6

>}&hc*C`|+cUK=Kx&SdiK#Mj|gJM^og;MO+jOuRc`&Rxv>w0I`Pg>D{OCM+XVvH;<-W_MB+&Ja}aJu?#&req-UTy__EagB2 z{Unvl$cm*HXRdO^-}m=B7G)cM6Jvgk)rPjYH#sHL^VODWhv18oay2)GD5> zOUB-tUj3T!!?O=cqteLQt*Et;H7Y%2c$M9{T1!x#PuoBH>U<@sAV-yDQ1=Szwz{=ZNxtLvq=8y~|BkVDdSrCj`tpPFsEpRD z>SrEGj>`D{GqhrCp`{<2*u)L@KQYvXgTJfFcN5=nodM>+!K^tDEhpN-8wdb*i<2#- z<3YBt3a;8;Ye?BEolc}Y%&wC}&duvror~Z8)>~(t%_!M%k{#dCg6z0`&*8#2uJWCZ z8~f*ie(d+-APGM8*QBP~JHGO_BITb&!60_FhJ9(v=|`&PhLD|DSGy^>*rhm8L*!xO zXo|g;nm7Vfghm~KmV6Xz&Ud$*{b=ai4`TE#aymOM#6mZ>>F>Co2G}KM9mwOSf#*wI zZkYJ0&*|y7Vd!p#=mko)+Z3*?{urOy?QBNYfhTT{)7a{SkjZtahx3dPI`WD&3}fH9 zzvK5G9S2ITAupyN-id~x=WKFqDAHas9E7@GtnYr1O>(=fr@7shiEg(!)p$TnvEyRW zonFundc&Tc>GfoP;5!pNoUS|@Lbmv=Z1KkfxiTRK=fYsuccRTM5FIm#)|ef5FKd#^ zjVwp84l*NIFQyxjs(l$pF?CaINNeGe3nt^Q|K|vysm8c>;`VF7s+hy$OI&-(>O@lGR3PccQ_5S`MT8 z&>(eaivvizpQPm=@q2Mv+UC71XKIH50G>7B{U92oRiLsTLOE45jEl^q3sWV;yqGm3d zi=~FSY@V_kX3dPzTq{z8GNacC*e)qJMArai+I!Uj(JOXGvhty z9ru>;X4Z4O6W$8$=Dd^MDSVsvp7);ip23?1;W{s<1vKxzgx-kcTnVwH04KtW+6)o} zD9q(L#)bwFaPYDp0|kTuVVn5_fhgs6c7du=4P+H+m}RE~S62;?I*KO!VXwvcpFoq1 zVQ2 zyZ6U^xZ-(G9Z*D}BXH{jr2zvNt3U!LKr6K^(4C#4wRMfi?M$@S#!bk$uNEM31JlsP z@USKNSgEXU@9w!h0Py;{#wX6+<;$0yY*RRI3&vzb@zr9<-oCI}bb#3vGUodz+taU} z`Odqy&zyD6a2u?jKffJC+o6x{_0FI9{}k@ILHPA6*mrlL=y8pQe*e|H=OT^czFp8$ zvhigD+oi+3%Rf82xYy%vAxS`-MxY>vmT7<<87(U*jZDwQhZf%0AU;N`oK#46 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 B_ap!S literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/__pycache__/request.cpython-36.pyc b/modules/modules/urllib3/__pycache__/request.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..989110af835b7c92596ba1ade55eebcb178caf46 GIT binary patch literal 5555 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 literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/_collections.py b/modules/modules/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/modules/modules/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/modules/modules/urllib3/connection.py b/modules/modules/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/modules/modules/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/modules/modules/urllib3/connectionpool.py b/modules/modules/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/modules/modules/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/modules/modules/urllib3/contrib/__init__.py b/modules/modules/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/modules/urllib3/contrib/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/contrib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7f71603043b67f1136ddbdde46faa099942aadb GIT binary patch literal 172 zcmXr!<>d-vNQ+?rg2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(SERF5OlWaxQE`l0 zVp3*|V?lvSVo73*PkwS@PE1H@Zb3{zW`S;IUU5lcPL6JBpF4Fs68#z literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc b/modules/modules/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b53b01d3c14c1c7640b85f46e2283ca1d76f4d45 GIT binary patch literal 1068 zcmZ`&!EVz)5Z$#M$92;}BUIo(76OtfOTRSs5YtOuSGkdBu|k)U(WS(?Oh4ho;k*vvf>Td1C(p1jvh&{QF=qE?|i&2#Mw>dn|Dw zwK;;k*sJMzH5Ng_qA&@`~Z9af^4`B|8oW7=~#S6yad4u@jJSB?cWN@h2IGK zu@6WuLmB!XRCK>X$C;nS*>Ri-879dwy+51WzYJ4kD?Q1+ z<`n?4LTah%Ob`g0@bWTP+bP(G6GZ{5C<-de^0nd*ZouKXj)kS7=1(@01tLsIpM6oG zgz7xPTmkqep$?9M^JicXEYT2;Om;{#WfA>38kxYn;pGSQn;X|_UU_cNy7f9&*Y2!x zNvAYnnQG{1{;2J?x^63Ie{6I<)mv^&%QYtQ@{)^fc)3EQnk`gC2-~>uYzOGT7b}2A zn*iC7gaIiyGCaNm-_5E`#s)B&>*+h?HXPJ+z6*+1lz50nu1I+bYuPFr@8iO^9oS-8 zhj^%|+cejRK2o>D@Ooym?griKMs7$xp_{pLeL&?_N))IUD)+KuYF{ho~Zx;9Tttv~X$_>rZEz>frl4bq@IicSe literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/__pycache__/appengine.cpython-36.pyc b/modules/modules/urllib3/contrib/__pycache__/appengine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32b1bf98e45267ab8a25dcaa556489f7d4c1d81c GIT binary patch literal 8263 zcmbVR%X8aCn#Y4rka}8n9LGrz+lfrCO^xmBOXcy#c4V(>Y}sSUd7!ifLF}dk3Iymz zQ#QF&wl>OPE}6<q+QhGp`X_kebGoK6&C!_7j6m-ij-gZC3{1yV?}AfM@1j#= z1y&47-Lg~0oB}Ham2TCkb}h&1)|^_m?$o^Nq%4xOHGU@1s4-=FpzwRkUri=h+#w&+u8aKj7y( zmz+x|FFTh}UU9CV{LuLjxJGn7q;B-q}`7(@FUj|cXT!ZiT|XcQg+5{Qzf;IH~TmRA=at*kFzw-?8o zII;jQ`&{uypykQVRFy{YZM)nUJ{(ZVc_PWuyd`3pCC& z4zp}uLSYAX7)i+3BKdBCe7m(1kxsTFVGp9du(8#F-%?aI?L*?_j^NymdMWiZyC3`E zwl&tdC_JhB(9N4o`^%_rx4e)x!Cr0!UK}rP=DVLM*{1#4mpi#4H1itti=^I)VtIqN z+q@(){FJcvhh zy&xy_tBk+qgeGj-TLYVi-c|qsWJ(n`3G|v$Fi;Z2k-g)A(j$9LyC5KQ;e!n*0WJBz z+JaPv<0UM;Ji*Bgz`ijFo3w%ODJnb&<~0meoA&S(DGu4JFqg6-emzoKlp(kd?XcrM z)D}7w_jt>150q}TqX58&bBI*Qd2gXt4vq^0-yJ|lS_!}R9 ztsgDGcD7;(qPeahkF}D{0x1#m1hd8}dSt^%JEOjYM4@z1*!H*kLLCts2SG^(Is<-v z5rthIN;~JfY5hQsx1lF9-c}q1eaYR_KCk{@qyuH>SSRwsMk%S1AXbEkL{g*b=bi{5 z>SXGv_vQtcVvvqaJr|LTT2YWT>+61(gS@m=SzCLeYQQ=DA~jM^Ip}9Gdg=uB1&@2s zKaO@eTZ?K@VfX^xZBcnPBxZ#?w2 z{0)Hq)RW%Elc?nd8|%E=+vxed8-9r041yc{)y@8^TVA-49pe0*Ilm3)ZR&2Dy@8kq zmPf<{ZA(R0?H|qMxf5KfEdY<=3{k&8#aSwHX42YQ)OQ}m&+v>q-oC=AK`!qCI^s*&LV_KM*{1pV5GrRwps;Dbo5Sm zE9MJe3I?z+vE&}Jqju_T#wOh6-9D6w!@R*0Bj&lTY#mH}+~4Y8Eg7vG?1Y&l-+%zF zg~$hs{ZLUwG=T51WkKZCr!$aXaV0Uat zA;Q>h_d!e=)4$In*RG9|pv2ayUe zBLHZ52-^|j9@&vB2FR?2&B-2Tl&`M0=q%EY-Z&iE13d963JLosb*3NaU+dC1(8L9_ z4An9_1!l_P0n#g3>Xb*?NT>S99BFQ4R6toB8NG+n>eNuLGYzM)usUq!I(&Sq$@!|y zoNzkL;lIK*jw6_i`pLj$@;v3LmK}5`MOtI_XHOv!h%I%x$4P(@;Bo8;I-RGG@E>ET zf#PETP74upYcX-uvj_yy=aGoSKFuuT)WwKw#u50KbphLf!%eAF(~p*TxI{)HmP>-S zajFqCQffshQ=Sg($ZpVVOo=({r!vdQIix>G{Mdv$?Cy2rr1CoT&2dtonsOJShGpc` z{Lq(hWD9#<;4|QKTUs3(W`R`sP*=dE`#cuYw5ActR@$(`_C9vu1wR17fwNzO=}Tg`qBFc zwls8DeVC#vD0E4MziGL0(Bny&Y7lKwQe9ieDZvIHIK&2g1;8mGr*oaoYE_5`{ATfx zbd@Xq1Hyoj*3m}AQR%?gFAg4#N|8M(c5uRXO;t1Ys}d)BWZ)d@qeAbNuQ3B_iqV}> z74Oohe4yi9X6Cn*ed}}WJ3YK#(6FY0>x{2;ZNH{#!&!;BquPP-wf?#GC9Y!_`oF4u zL9-XsYzwo0pUu9)3bKaT`ff@5R@PZDT`8xi?>L0;Kh^r_UF$ntR5A!xSt*C`-*N`H zjZux2zcpdCPKWYK1!Y!2`J0^TI;)&Ub-1Z!&#Bp4+3aaKe=2<+tGQ>?++SsL7r<3@ zq@O!gCUorsi7t$+w$7|k(bq?ne=~lm@7G7A@AT+*qk8A;fwn(2n)=QVg7yNO{{g#p zj@~J^taboi!(U)#!hR9gPuD=>3@9{2GrfRP z&*fBSZO0slWvajocX>u z#zXWr7FGovyN8W(Qto+!Ao5sJN`0rei~(l`QFQd$MM@Tu*(e=urrF^C#Ucax)ZDG>7x+ zfQ{I5fN2?eWF#e6`8W!P&nM7jA;tfSZybD#@!h^PiSJ4dkwv&(pipZZ38g|>wm(d5 z@^GF|9VN|Qf@~8LmqSQ`Dq~DZ(e2?{Zn*FwV}TOs4`chrU6e=`K7iP1cFJE;mT6`; ztf}1W#=SNS?69gDgq>W(R>THsyHfXX6A;8L6pc$rq_(-ty$p>cMTsCZQ2s3`Dlepb zNpe;GxIo9P7bnCy@`qY4dponnN?@%)97_b znw738Q{UNf{)r8JLb{^HoHIyV9~}D0bb&<+<})N|8k^#|>`u7Rbi-X4xfBC{iIlkCUn&wgjj6KbeUG&U-Gh93{d*Vg}K6Qe=Fq zzb(jTC6u{GNFiwxq9CaPTk5Kl3Ze#bx9P^Xn9^ihBC;kNrtxz`%1PvB~ z1PUGKPr*Y4|5;;Rzlf)v^`18tP@mT6P4mv-oz~w2gn4rsVaBXJjew(IU{s$43;Dm@_JLOjbls5mps_WVczdgBH9t<}>pSqV={WkwK$f zRlOFC;Hk0F_wfA6_mob|QZq)#$j5VFZ7Zw8S-N}Q>D2BwzJ;Dj$|$pK0Z5m0k%Co0*!hycOrsSD-sjx z3iU+(EXj&?qdlG!=pstcHBMsqQBuB7N!#ORNjan3u~G$hK}b?d&x{LRc%!To+?m2= zjf2~`C+I>Y8MBS}FlF1xxy`$h>Ub~~&#~yZuKqpx{tHh`CrC3&X5D~h8g;V*?XjSt z1(UR>K>BK?8b&%b{P<-2d4xi`20LLla!n(RGx4Z6_&zElU1}YDw<4w~N0SD%4-9b^ z8euYRw;EqZtw1&Lce2|3vEZASV-VyI$iMU7w-G_<4M$y1IqB=R1CP_@cz&R>7GDQS0BD`*g?(aT8@xl_jxEN0k|} znu;94HdjHta(r~sNKnI_T=++0k5r;$E|HR{`=s3M<2owZ4(Vbe6BBKQ$F7t7#}*eA zn0veD30!Ex*v8F4MML!{x&2`a1I5qnDFO*>#aEyRM*IQe2_pDix$iVuK3u z8G;U@psg1~#Dq>L5>+z#HU^&IiRtFEGG8!2;ae56f>dV4@4&2a!koI954QX8D^rY1<}&O-LB z&&%(Ty`G=OR<+0KBWxP0P+;%`yubx3f&T-Mqs|xI^eRa>^~uky&cbAC{L$5!M=u32 z!Qo|u_&GtKjQ_N4NGf;ITlKq(m=V(nF2F03Plrb~>}nm}SN-9q;jwkgw9MH8{{Nyq JqXSI;{{g@GLq-4q literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc b/modules/modules/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..828a978770f366927120d66505065b6d5f4cc94a GIT binary patch literal 3214 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 aJ*Q{$*<5xi`)2m~_|vqSr+j_<{{I7HD5~fH literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc b/modules/modules/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea0c2a3f3650c1d97fca9fe23d76a118c7827a2f GIT binary patch literal 17867 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 KxV2<0;Qt?i^d9>F literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/_appengine_environ.py b/modules/modules/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/modules/modules/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/modules/modules/urllib3/contrib/_securetransport/__init__.py b/modules/modules/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/modules/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ef1aaa98f001a5a8b23dc3eb70f27918981271c GIT binary patch literal 189 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 LO_zSR-4Fi{d@R(t literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/contrib/_securetransport/bindings.py b/modules/modules/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/modules/modules/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 + + 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/modules/modules/urllib3/contrib/_securetransport/low_level.py b/modules/modules/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/contrib/appengine.py b/modules/modules/urllib3/contrib/appengine.py new file mode 100644 index 0000000..2952f11 --- /dev/null +++ b/modules/modules/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from 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 `_ 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 + `_ 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 +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/modules/modules/urllib3/contrib/ntlmpool.py b/modules/modules/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/modules/modules/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/modules/modules/urllib3/contrib/pyopenssl.py b/modules/modules/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..7c0e946 --- /dev/null +++ b/modules/modules/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/modules/modules/urllib3/contrib/securetransport.py b/modules/modules/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/contrib/socks.py b/modules/modules/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/exceptions.py b/modules/modules/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/modules/modules/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 + ` and :exc:`ConnectTimeoutErrors `. + """ + 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/modules/modules/urllib3/fields.py b/modules/modules/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/filepost.py b/modules/modules/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/packages/__init__.py b/modules/modules/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/packages/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/packages/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..952615fecd45dd7804b1e4bcd863ea39cf67119e GIT binary patch literal 298 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 gZra%xH>uxYq_*= (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/modules/modules/urllib3/packages/ssl_match_hostname/__init__.py b/modules/modules/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f6467a6ab35c62f3b17910aac88187bccf3ac1a GIT binary patch literal 559 zcmZWl%W7LO5FP1WCyw)I3f>gF@S+sFNTAKGgwm1+6iPOIUj#zFk{i`}+(@#)C94+l zFWL2b?zSucLRTHtrEaK%jt0${GiP+PyW4vQ6ZV|~{D6PfeT<*ui8lxmBr#CI;*o;S zL~czX3>1~+H}aKWu44*YR;BG!9RlycU6i2cv=^=k-Vj;h>O_n%vFfmJFeZtx7#mm z<3m~r7crW3K{d#hayA}fg5T|0-Q(IeMp@;ONT}Cta*ktgehXnI8_4j}o;+o5BX(rx zVyxMVra2W!uvfkohP_d?VU2DMw2KLA57gD;+0_%_*en>M$47tf2AzmcDzg8LFpiVx i#Q9;fXuHSO%b8Kn@}I;$LYLB_N4m66_6W^L2gNTGot2~j literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc b/modules/modules/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0f04d7a122fd1c7c9151a47f61bfe2a8cad84e7 GIT binary patch literal 3262 zcmZ`*-EJGl72eq&az#TnQm7*LvhLF z?rLTji^S?Cas%HK$VIRE1_kl}d6HbrZLa(RMbWE%vnwjHfbL?>oSi-Mcjlb$oAsro z#tW<8TYt~8ezMLyP3WJaNCm;HuEhwm6VfGRZFlWyv(%if^U_K$yB2px4RMcH=4E!* z`ID8}f3%p>^}eu}%e>bX^LXvp>DJi=R%iZe()HN_YrM9)3v7`!Q8(BUYoT6b_O8{w zIQ#P1fYWiPqCqgoq)NjvztN`sNgAm*OKD$ZWBO#O2GG|#cvmTxlBX&T6Z&evQ#z4x zx=(j^w>xjK3u|XqU+>)MeA2lUna}w{pnQ%Z&7Qf1Em~ch5iG&h7dN?3aX*ei#kYjW z#7^7Meh`?o1c7b@!8l`+#OTc+IGBV<_2*xfsA05H{8w$>?>(1X$lk+nFYayR`GZh} zz3nUtlio8v&U<;Buf?fUVUn!zgIkk>+hN+9h$M;k)=%p^j7H%;mpv(y;9a-$f_R)K ze2mS9#y6dODs0UEOS3Jb_@w-PYxWvB5awy1xG0+_^4}2q){#@d4`%a)HN-g{lOwlq znRCTD@=)U(|7Jt472c4r8vfRcdSQ=Tv8`-YSLl6A-beX{6m|JmjNu+z1u=4jGc7z; z8`(k?&d_82F(Fp^8AhtHg<~S$z^>H9Kh1wtANqxNOiHWEXIqAd8n$?hwGr#^YEgS& zeRb)`KefQP=Fh3F4lVAv^9_IqlIE&xKzLr$9!Qn_`QiT6D(mA zWr7(^W%TL8O?vm%?K`Vf@+#);c7D@YZ!{>Lfl~SXn>SUKC9)H9)$e3t|K>oAlbfO+ znQkAR^jfQWnNANi=?HTO!iU(=WM#IB5fJ6+l)j1+7KMUI8mBb+Iq>L%on30;>OP%$ zfBsA7t6$ID!*p$JX7^UAh83tAC>@k;yQMvuC$Z9Aluc4qp1gJi&xQ7q>=hTf7Unrm znQkEDgp#jfHPE);y2fP`=3LidoP-gSC>!T-!nHfh;#4;teX;ZS>DK1P?w0n-5NtQJ z%~I{p6I3sa!^7ZoC)&+JCAF8EX|$j4z8WKy^@8BzFisiPvT(+@FT#E8pv%wMBkFLJ zZUrorWonhPUO}5&fv`N6;B_0sCrumDvq{Tw$wkk1n>V>|Ayl1;N2t_x-kR*uUMQnD)-|a_94P>W z&(kO~aRVP3oRDoIK7?i4(~TG~1V^Xvr-KdmL@0}zm^L7et8U7w^e`tvr?PPR8Z zzx~BPWxqbD?EOc)@Qohs1hSwQ(AqAH42GNmlzGX0gJjQ8V|(=erBvY!dW z(U|r#LDe9ZWtQBSXU?t8Z#%c?8ol;-qRd3QQI_*-?M`XccJ)G>pG*vg<-v(w?oQW) z@pBI7t;M;C0$n%p7R0%>CT zB2qN%P0Q%Q1z-@A1Wfz3`?pd3qp z>?I8a$9#zaQ?^R?5YcDzru>~|SW6V~Tvcm3J3*CK=dTtt#?r%B!rt6&!Z?`--l30E zDkm67%GGkA^ZQS=oN}v@Vm3oxRW{8O?i6ZDk%wt^mPl65-KJ>DIoKvNS0pM+7nx4x zE6P&E4;45`4Je1;f^Kd-eHJ`^^6b&$osDf{ST;P}`or@_Pq!ZI=$4%94MCI}iP|wq z>VUUq4R~gwLKIy;G0+Xr$~a4nRY`=ikLTW}*TpHglu$pP9FTEc&g@k>yZZlauZxmg zXTQU~L2)9>MU0ypb~B&OEc@MM(tgYncmcd<4t0{U_66N|5hj!B#wTt9AH*j{7^v0F z=M_|!*FoLdP=F>xKxM2Qgjh*6!oW%iHrh#eT9U9Z_c85^!(1#uYx~+Yp(qTUiFNbO zKcP7Zk_c1njQCW0Uz@d{VX}7~>RP3XPH)EnhLB%ESiVbq$F`SA%l1jjML}IdaY+-T z;gjW3tLhf1Ij{s#HqmNG#kD^u<+3dvVl;4>0m^n$*Mop%Q4ok<;9D35F5ROSAC2=& zsLCgcK`~7#EgaDF;5YpYpm~a=rg)b*KK!khHuE;d(ytYj(NxhV42R L-Nqf?^PB$z#(8eQ literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/packages/ssl_match_hostname/_implementation.py b/modules/modules/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..d6e66c0 --- /dev/null +++ b/modules/modules/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used in Python 2.7. +try: + 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/modules/modules/urllib3/poolmanager.py b/modules/modules/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/modules/modules/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/modules/modules/urllib3/request.py b/modules/modules/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/modules/modules/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 = {'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/modules/modules/urllib3/response.py b/modules/modules/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/modules/modules/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/modules/modules/urllib3/util/__init__.py b/modules/modules/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/util/__pycache__/__init__.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c06066d30a718cd00f203887463f288361c40bb GIT binary patch literal 1102 zcmchW%TC-d6o!+zWhRrkFc)rx(stEZP^o28RaI3)sfvUKG#QYvB3WVLfe1SZwgcsT zy6G!<+ZC_SRnG}(2X)m|6XnY}$4UJAKh938<(^veU{JBFAJ(H|0P#n-)Hgt6MK-sD zO>EnWN>Q1YM46O}xWX%SEI-*Ou z#d8i{563WJ7F{O~{{-r_q*g zjh^3wQfp+JPI#_To@+*9k)=}K+Yj|&tmrIF5;oIun$Sq5S;iuG!4u&Xqn9j0Q`+Fyo{pn

>nRZ zrluDv#iXY5IJsallX0TWl4PLmhS3?0NOrAE|943#PH#W~h%+5bZe^HJmCml19+iwY z%cW$AraBhPI8$JnYmi%=FfH#!6;r=pnqH<#n?@E&#b_?MX{wCJC_+NLd?Gn~s&yM; zDV3lgj7OE9x>7ki)(Zyabt&Xg`>n>w^3OB3iEF3MD}5f2vpWlLef zVv)E$<6v)~D-YJ7U8X9rJB5Fy3=Mf?Q{fBRX)4%(g*(QfG~}Gp@0NT4;{|@6?!606 zK$i+Whv#vyn`NIu9R`Q#EabtIi7d$CY&%YrhIhBw_3QllO_&5QCy&o}7Iz)7O-KuA=*19#z{+II?mJ|-_ literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/connection.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/connection.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd8d1dc6d0b13814a3c1220775f8f46ca81a7108 GIT binary patch literal 3139 zcmaJ@TXWmS6~>Juc$KWUxlJbBq@9VW+M2{}^}uO6Rb{DG>(CmLiX4S52y&MqC=h^m zmzJmj^AP2+?Jwvb=xh5I`V;zu*UWUr?|sTszFklkdol%PfyM6PoZWN2^PTgcUax#% zjCwy^GmP(y8<&m#@6beq2Q{b}8dLMgG*#aUts{%t)CujWbL315M+J-*XfZ5KOGhR2 zOVs_=IC7aaDN~DDBb%0K@))&%1a8ayRCkczD9(4(Bn?>ZcgDq2V@@wq?M|F!ghlH3}Gz7VbcSjr>}1{;sM z-Tmz=$$b(JCQ!1J(2gZ*5g3gmp)X;lsUTr+!pK&V>}Uhs#n!N!(;y6qAD;SiLAc&K z>Gya2P_TZV$XII+nbhaF6h+3^d-&S9I2+D~VGtb?$^A%R|16T>oIo>~i483#a|ArN z+wLC2`uc+NOEQ?UcqW^6Ryt^;-sE@7gmP$vpc> zAiV1lZ|SHKlnMk699%P9)6vbcYG%Xa4U7)ePSv%Fb_-1-?0@K_M$cL}i$dy5fV2yf ze}JAsoVjqQy(miS!dR5f{weK=lR9Z3EumMqa2^`Z|Gscjw^vw{7nMbIQCrlpzA=A< zc{?qqm9z@fHe@kvr1phn0<)MYos{|4X=CE1(1kIJ{{>&=6#DShm{ihw-qT37Cskni zKc=x*F^%&N)0G9J0r_SAZ>+6dD1<}Dq46c&=&gLc^2~VAQti-4i+bgM)8aQubCo(5 z<~N8N#6rQR2(=|JfgrN(Q_7hT>l*P(jH$3tXaKTa!!7=M$)bQoLqn2ymdi5s6@$D@BMzF-s8FjHTj-QrKR0?8QhUIUU!rFR^f7`(NTuW9A&V~hNP^xJb{g1%PfDC zx#|x&Pgqt+cr4?rJoF>5sXt|zC45b)naMP(=8w8kd~1l5ie!B4tB)`&?&D!JT(g4P zDHN@D!GDfvnGL&Q>9KsqTGI^an(tfSN{jyje+^acRhPYNnj!Dt1G&{euB}m{W1PL6 znqa=h!b*(^*z0d#pciY0C`G_3W*fOe*;1VeMsM2r_Dh!zu+e$rB>Zh?I6xCBeHe8A8&+}FE>;*VnX+Qs0S0&3!M$&1ViQqUw^Z}lyF+U+e zP6jZWWM>M}I$UnR=q@=OGjKxgr{CoM+}PUn4%(glooyvl1=eM_Bgbk9IzuOnBbKJb zClA{lgsaboW1UH)a-sxuUqpgm&xBtav zR=(2OH2Kf4=uOk9eD@qJH(j9!rxs1FMz0Dg8y{B%)c_yVTp+nEEM>wAgWpyKlC&l^ ze>(pdZwn1+LKRz+0!lA?q!SZ$7S^E=-9~X$L_*rni>oh<$a)5N@IPa9NhPBc(wc?y z%^$6>#9V-93GlsSqiAW9JoRjl_AXa$?lxVn^7+wir26YxQNY%N_$)V(3z#A4AhRSDsu z6*20X{8yMiw_B~xnk!kw^F}jNlFakCik^IHj;eZfWu$8)O(kHmfj*NiM)*5wu?jkk wbL}xLn18CqQ~`D4q2t~C^)#llko{H}NT?W4WzMQuv)%U{v+=-n-KzWH4}_Ck>i_@% literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/queue.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/queue.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f1574c479b6d40cc88ac8cce2ded7460c078c10 GIT binary patch literal 1013 zcmZuwO>fgc5Zw>kanhs|=%4VR5wtgiP*E$mR1v6vgk@>vdN-BB`XgQ&L6uwbXZTBd z<R(m!0ZV zhSY9xIGjS5Cjg4XRFarUD%pm_TzPXUx%4(P_O~)|AO|u8ZXkysGqS^rd|thE*P<3K z+%e7|%sxO%7IaNkL@-I;oz!`Kl$WMWwLVhIr`_^6Et9U%I=?#kv$wfU zTmz={SL=(s%-cP*=zP@(Ct?|e5QP?l>|I@?=70UL;= z$!`?4VkdUc6LaMKY6qwWS_`_OYYKC4*FWYoZIITrDrLmB+FstO;$Lx3)Lr|qC%xa3 z1}cMLbPIP3_t{*TPI&#dB(JL)O2%6MSGrd1ArQMF`$|B~qR@sylxd-aup=RgN_HC0 zVJ7>K`zL)@5~0-idyY7wME!eHd zzjF^Lw_#lcY#MAEMD-{<&nEy$kZVQ9sidz&A|%sc@`_4vo(rYvL@+L->UxH}modp= zdL~5XvnYHmdge27dNQUbCog0!PEOjCajs}HNRvbaI!u$EInpslnoFM7S+XDynf8rY z;Qlq=Lzd8ypp1^vG!iUn(eCS0O zMWDB)r)ii7PDfK3q;bsFWY5hlB_RlsE1+VEW-@&pa>1{w0lU&?fTLb(uw)=bCWV3> zgjY`tC)qKybeiV$f+e7q%7Y28ztU+xo9aoLbaEL*;poG=?|1L-U$e!CsW9+at|#jo z57P*aD1p|}ATCOkuvmckl)6YIUqWY$-o&%13};|?w3J~;yWMW{N(iL*UaJ8JZ>Iha z7s2r9`~X3Cs4z_ZfCZEPu|{Ye@@l9oDnzL-am6tK@pz z`D3wj&4RNZe~(#b^%df?9RvKz6s>yUg(^&xW=S9l2ZFnBG1LneL$laDI6ORh_QF5v zA3lBbr2l8>K$4Xen2IVFn9N(X!pK=>CP@6(Q%YeJD(zEvYo9IlZhCRCbIqNK+S20x zwB%cG-*+z$d&8GtEH!-0M&a-v%N{Y!hR12ZqTve>XTvPaI!2W!>WK3X^7B8iWVj6B z^}i0I;WE#5vuV-T^sa5VNWBM>^*fii#3MG0hV7F2#<0m-@K(-sTfPm{0ai48@V^1W z6r|5!F(;gyZOJ=OgkZg}iIwy;nM2{_WZ{^-{cU((5+8x_xo;)TN z{&eM%d}Sr}m%srEi8K4FaZSkmjAp3{F@w->ogCXVPG1W;4kLk?SWlP+I;gZ|dVLCM zP+o)zV&_6MArUjJ0X~hi5^M^IYJ)FUsBx}yX;Np&p!qYLL-^ zmz2K%#f#dLr>1rnwWrU^#kT+W;K}jPqZdcV$58%VbI1V=jDgGP=Xmr-N@yR&_gCtD z3ZK;;Oje~%8e|XPZ;;!LXUpHhw=4J^c)5aK!wbUB3AY!{r9HQ~4W{S={6u3vfWX_> z4-o4M>pa^4{*x8(9P0kp0RDOQrIqZ%x$0S6p6CjPivKl9_H>O`bRBv8)WR>^1_M=R z|276X*u)ik8mOjxiZC-82&q|^T-mP#_L&T0Cc|i27Cgj$)e=a-L$D6?3=9}a0rgSb zXb_P5x*RRXh9ULT7V4p_QAjl<%N-riN0Vz@I&Bn$6P^wj`a~Cz4c4wcxOt6$}_@Hs$mHkc4 z{2%OijtvQ5x`JrM^B&%YE=1!Tnht0q(lNzG6SOd0XB!quL$5_c=t-cxcvp2>Tk@CS zI1*EV#6DC03a4M=gzcuJFcseCEXqac)-JMaIr2BSQD5B&{Vv{)0NrqJ`3?~JFw`BG ztZi`Q(w)hkT_>L75<}6d_RZ7UEj-^ZL(umnW|*Q1iB#ObXR`62k+I+mIvUkg;Tw~i zjogJN-e7kJ$w8Hp@0z2fHyAZc?lKW%ZrqR)Gp;nTSpO(ac^-)e1U{+TFf||}?wPDu Lbu8i?)NlU><9eC8 literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/response.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/response.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c485ea32ab21dfe8b79b1717e9291399682b7db GIT binary patch literal 1942 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 V#IIrIOQ~YIs25YSf3DG=@jv*I`iTGl literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/ssl_.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/ssl_.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93223c9a861af379babf5af54bf52ed9a7190a6a GIT binary patch literal 9496 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 Tjr^PWaonGOrv4?!EPV0b=C>gC literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/timeout.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/timeout.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..562db509d7229bdfdb339e4d6a12a3b93d45c136 GIT binary patch literal 8743 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 literal 0 HcmV?d00001 diff --git a/modules/modules/urllib3/util/__pycache__/url.cpython-36.pyc b/modules/modules/urllib3/util/__pycache__/url.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40bbda4113109f61c3b41f2992505da26200881c GIT binary patch literal 5162 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 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/modules/modules/urllib3/util/response.py b/modules/modules/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/modules/modules/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/modules/modules/urllib3/util/retry.py b/modules/modules/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/util/ssl_.py b/modules/modules/urllib3/util/ssl_.py new file mode 100644 index 0000000..64ea192 --- /dev/null +++ b/modules/modules/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/modules/modules/urllib3/util/timeout.py b/modules/modules/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/modules/modules/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 + `_. + 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 + `_. + 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/modules/modules/urllib3/util/url.py b/modules/modules/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/modules/modules/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/modules/modules/urllib3/util/wait.py b/modules/modules/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/modules/modules/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/version.json b/version.json new file mode 100644 index 0000000..c347951 --- /dev/null +++ b/version.json @@ -0,0 +1 @@ +{"tag_name": "v1.2.4.3","tarball_url": "https://custom.hk-fs.de/uploads/contentcenter_fusion360.tar.gz","published_at": "2019-02-22T10:19:11+0000"}